php - 如何检查是否允许在元素名称的开头或内部使用 unicode 字符
问题描述
我正在编写一个解析器,它读取 JSON 流中的每个 Unicode 字符并相应地输出 XML。然而,在大多数情况下,JSON 可以轻松转换为 XML,而 JSON 对象键几乎可以包含任何内容:
{
"100": "valid",
"٢٢": "valid",
"0x8F": "valid",
"3.14": "valid",
"2alpha": "valid",
"$@!": "valid",
"Europ€": "valid",
" ": "valid",
"tag name": "valid"
}
但是,对于 XML 元素/标签名称,情况并非如此:
<root>
<100>invalid</100>
<٢٢>invalid</٢٢>
<0x8F>invalid</0x8F>
<3.14>invalid</3.14>
<2alpha>invalid</2alpha>
<$@!>invalid</$@!>
<Europ€>invalid</Europ€>
< >invalid</ >
<->invalid</->
<.>invalid</.>
<tag name>invalid</tag name>
</root>
但是,以下内容是有效的:
<root>
<_->valid</_->
<_.>valid</_.>
<éÞäğı>valid</éÞäğı>
<Ë231>valid</Ë231>
<გამარჯობა>valid</გამარჯობა>
<สวัสดี>valid</สวัสดี>
<你好>valid</你好>
</root>
甚至可能是这样:
<root>
<سلام>probably valid</سلام>
<שָׁלוֹם>probably valid</שָׁלוֹם>
</root>
我可能在最后一个示例中说,因为我使用的一个在线验证器认为带有 RTL 标签的标签格式错误,而所有其他人都认为它是有效的。我预计这是由于该特定验证器的限制。就我个人而言,我发现尝试比尝试理解 XML 规范更容易。我从实验中收集到的信息如下:
无论语言如何,任何字母在元素名称内的任何位置都有效,下划线 (_) 字符也是如此。数字(无论何种语言)和一些标点符号 (.-) 在第一个字符之后有效但在开头无效,符号 ($@#₺€...) 和大多数其他标点符号 (!?,;...) 无论如何都是无效的他们的立场。
由于这很复杂,我需要两个函数:
public function charValidInElementName(string $char): bool;
public function charValidInElementStart(string $char): bool;
我想知道是否有人知道在 PHP 中是否默认提供任何此类函数,或者如果有一个版本ctype_alpha()
对所有字母返回 true 而不仅仅是英语 a-zA-Z,或者已经编写了类似的函数。
解决方案
推荐阅读
- javascript - 将字符串总和转换为浮点问题
- sql-server - 如何选择日期和上一个日期
- excel - 如何将选定选项列表转换为所有可能选项的是/否值列
- ios - 由于未捕获的异常 NSInvalidArgumentException 终止应用程序,发送到类的无法识别的选择器
- validation - 正则表达式模式注释验证java
- python - 试图进行评分预测
- python - 如何从收到的响应中抓取 html 代码?
- scala - 使用 Spark 在 RDD 的每个分区中使用固定的最小元素数重新分区
- html5-audio - 播放音频文件
- android - firebaseAuth.logout workf 用于菜单活动,但不适用于配置文件活动