Php 如何检查元素名称的开头或内部是否允许使用unicode字符

Php 如何检查元素名称的开头或内部是否允许使用unicode字符,php,xml,validation,unicode,Php,Xml,Validation,Unicode,我正在编写一个解析器,它读取JSON流中的每个Unicode字符,并相应地输出XML。然而,在大多数情况下,JSON很容易转换为XML,而JSON对象键可以包含几乎任何内容: { "100": "valid", "٢٢": "valid", "0x8F": "valid", "3.14": "valid", "2alpha": "valid", "$@!": "valid", "Europ€": "valid", " ": "valid", "tag name

我正在编写一个解析器,它读取JSON流中的每个Unicode字符,并相应地输出XML。然而,在大多数情况下,JSON很容易转换为XML,而JSON对象键可以包含几乎任何内容:

{
  "100": "valid",
  "٢٢": "valid",
  "0x8F": "valid",
  "3.14": "valid",
  "2alpha": "valid",
  "$@!": "valid",
  "Europ€": "valid",
  " ": "valid",
  "tag name": "valid"
}
但是,XML元素/标记名并非如此:


无效的
无效的
无效的
无效的
无效的
无效的
无效的
<>无效
无效的
无效的
无效的
但是,以下内容是有效的:


有效的
有效的
有效的
有效的
有效的
有效的
有效的
甚至可能是这样:


可能有效
可能有效

我可能在最后一个例子中,因为我使用的一个在线验证器认为带有RTL标签的标签是畸形的,而其他的则认为它是有效的。我认为这是由于特定验证器的限制。就我个人而言,我发现实验比理解XML规范更容易。我从我的实验中收集到的信息如下:

任何字母,无论使用何种语言,在元素名称中的任何位置都是有效的,下划线(_)字符也是有效的。数字(不考虑语言)和一些标点符号(.-)在第一个字符后有效,但在开头无效($@#₺欧元…)和大多数其他标点符号(!?,;…)无论其位置如何都是无效的

由于这相当复杂,我需要两个函数:

公共函数charValidInElementName(字符串$char):bool;
公共函数charValidInElementStart(字符串$char):bool;

我想知道是否有人知道在PHP中默认情况下是否有这样的函数可用,或者是否有一个版本的
ctype_alpha()
对所有字母都返回true,而不仅仅是英语a-zA-Z,或者已经编写了类似的函数

不确定是否能处理所有您想要的实例。“就我个人而言,我发现实验比试图理解XML规范更容易。”欢迎您在做对之前度过许多愉快的实验周。在规范中找到它大约需要10分钟。@NigelRen我想是的,这不是完全相同的问题,因为问题是如何确定整个字符串是否是有效的XML元素名,而不是我问的字符在元素名的开头或内部是否有效。但是有足够多的东西我可以弄清楚。我想做一个基准测试,以测试创建DomeElement和RegexElement之间的速度差异。我不确定是否能处理您所关注的所有实例。“就我个人而言,我发现进行实验比试图理解XML规范更容易。”欢迎在做对之前,参加几周愉快的实验。在规范中找到它大约需要10分钟。@NigelRen我想是的,这不是完全相同的问题,因为问题是如何确定整个字符串是否是有效的XML元素名,而不是我问的字符在元素名的开头或内部是否有效。但是有足够多的东西我可以弄清楚。我想做一个基准测试来测试创建DomeElement和regex之间的速度差异