1

我在 perl 正则表达式替换方面相当有能力,但我有点生疏了,这是我通常不做的事情。这是为 XML 转义一个 & 字符,但防止在已经转义的字符中替换 &。它似乎工作正常,只是它删除或替换了它右侧的字符。我错过了什么?

$str =~ s/&[^amp;|lt;|gt;|quot;|#39;]/&/g;
4

2 回答 2

5

您将否定字符类误认为是否定前瞻

你的正则表达式真的意味着:

/&[^#39aglmopqtu;|]/ # mixed a few letters and removed duplicates

但你的意思是

/&(?!amp;|lt;|gt;|quot;|#39;)/

方括号表示字符类,而不是分组!

如果你真的想避免匹配 XML 实体,你应该使用像这样的正则表达式

m{& (?! (?:
   (?:\#[0-9]+)
  |(?:\#x[0-9a-fA-F]+)
  |(?:[lg]t|amp|apos|quot) # predefined XML entities
); )}x

(比较XML 规范)并以某种方式添加您的文档或引用的 DTD 声明的所有实体。

于 2013-01-04T22:38:55.920 回答
2

看来您需要零宽度的负前瞻。就像是

$str =~ s/&(?!amp;|lt;|gt;|quot;|#39;)/&/g;
于 2013-01-04T22:39:50.777 回答