首页 > 解决方案 > 如何检查是否允许在元素名称的开头或内部使用 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€&gt;invalid</Europ€&gt;
  < >invalid</ >
  <->invalid</->
  <.>invalid</.>
  <tag name>invalid</tag name>
</root>

但是,以下内容有效的:

<root>
  <_->valid</_->
  <_.>valid</_.>
  <éÞäğı>valid</éÞäğı>
  <Ë231>valid</Ë231>
  <გამარჯობა&gt;valid</გამარჯობა&gt;
  <สวัสดี>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,或者已经编写了类似的函数。

标签: phpxmlvalidationunicode

解决方案


推荐阅读