Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于将字符串重新格式化为安全xml标记的正则表达式_Xml_Regex - Fatal编程技术网

用于将字符串重新格式化为安全xml标记的正则表达式

用于将字符串重新格式化为安全xml标记的正则表达式,xml,regex,Xml,Regex,我目前正在尝试编写一个RegexReplace,以确保输入可以用作有效的XML标记,这意味着:没有空格,没有特殊字符,只有小写,等等 有没有一个共同的方法,还是我必须从头开始 例如: string Invalid = "asd(%4 asKUd n!%mn &§a_As1"; // Invalid as a tag string Valid = FormatToSafeXmlTag(Invalid); // How to write this function? // Valid

我目前正在尝试编写一个RegexReplace,以确保输入可以用作有效的XML标记,这意味着:没有空格,没有特殊字符,只有小写,等等

有没有一个共同的方法,还是我必须从头开始

例如:

string Invalid = "asd(%4 asKUd n!%mn &§a_As1";  // Invalid as a tag

string Valid = FormatToSafeXmlTag(Invalid);  // How to write this function?

// Valid = "asd4_askud_nmna_as1"
  • 仅小写:
    ^[a-z]+$
  • 第一个字符小写,(可选)剩余字符小写/数字
    ^[a-z][a-z0-9]*$
  • 仅大写:
    ^[A-Z]+$
  • 第一个字符字母,(可选)剩余字符字母数字
    ^[a-zA-Z][a-zA-Z0-9]*$
编辑:删除javascript中除小写字符以外的所有字符:

str = str.replace(/[^a-z]/g, "");
问题是当用户只输入不可接受的字符时,您将尝试创建一个带有空字符串的xml标记。我宁愿让用户再试一次——输入小写字符串有多难

注意:另一种边缘情况是当用户输入
xml
或其任何不区分大小写的变体时(感谢@Tim的回答)。如果您使用的是javascript,则无法使用Tim建议的解决方案,因为它使用了Lookback,这是javascript正则表达式不支持的功能

JavaScript代码:

str = str.replace(/\s/g, "_"); //replaces spaces

str = str.replace(/[^a-zA-Z0-9_\-]/g, "");//trim symbols

var reg = new RegExp(/^xml/i); 

if(str.length == 0 || reg.test(str)) //is it empty or "xml" or "XmL" or ..
    alert("invalid regex");
根据,元素的名称按以下方式形成:

Name   ::=  NameStartChar (NameChar)*
在哪里

NameStartChar  ::=  ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] 
  | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] 
  | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] 
  | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
NameChar       ::=  NameStartChar | "-" | "." | [0-9] | #xB7 
  | [#x0300-#x036F] | [#x203F-#x2040]
转换为正则表达式非常简单

如果要删除此定义之外的任何字符,只需反转表达式要查找的字符即可。

XML标记(我假设您询问的是标记名)必须遵循以下规则:

  • 以字母、点、冒号或下划线开头
  • 仅包含字母、数字、点、下划线或冒号(用于名称空间)
  • 不能以
    xml开头
因此,有效标记名的正则表达式可以是:

^(?!xml)[\w.:][\w\d.:]*$
根据您的正则表达式风格(例如,.NET在
\w
中包含Unicode字母,这对于标记名是合法的)。你也可以使用

^(?!xml)[p\{L}._:][\p{L}\p{N}._:]*$
如果
\w
不包含Unicode字母

当然,您可以使用更严格的规则,并且可能不是所有XML解析器都可以处理完整的Unicode标记名。所以最后呢,

^(?!xml)[A-Za-z._:][A-Za-z0-9._:]*$

这可能是您最好的选择…

您可以检查XML解析器是否可以读取字符串…@Welbog-这是一个比这个小得多的例子,并且regex可能工作得很好。如果我读对了这个问题,他只是在验证某个标记名是否有效。这是一个比查看某个内容是否是有效的XML小得多的问题。有效标记名的规则可能很简单,他并没有试图用正则表达式解析xml,只是试图验证用户输入以将其用作xml标记。对我来说,这听起来像是正则表达式的一个有效用例。实际上,我不想评估标记是否可以接受——我想接受它并使用它,但要格式化它,使其有效。例如,如果用户输入
asd(%4 asKUd n!%mn&§a_As1
,正则表达式应返回
asd4_asKUd_nmna_As1
,作为有效标记。@Herms和Amarghosh:注意。我已删除了我的注释。单字符标记可以吗?(您的第二个和最后一个示例将只匹配具有多个字符的标记)@ApoY2k如果用户只输入无效字符怎么办?你从哪里知道它不能以“xml”开头?我认为这不在规范中。请看Welbog的回答。我在这里读到:(对不起,它是德语)如果说
xml
是为standard.AFAIK的后续扩展保留的,
xml
-标记是为特定于xml的标记保留的^^^^当然在xml文档的开头有“xml”标记,但是规范没有对以“xml”开头的标记进行限制。再次参见welbog发布的语法。