这个正则表达式的任何陷阱都与尚未编码的&符号相匹配

时间:2009-03-11 23:35:36

标签: php regex

在PHP中,我想编码尚未编码的&符号。我想出了这个正则表达式

/&(?=[^a])/

到目前为止似乎运作良好,但看到我不是一个正则表达式专家,我问这个正则表达式是否有任何潜在的陷阱?

基本上,它需要将&转换为&,但将&保留在&中(以便不&

由于

更新

感谢您的回答。似乎我并没有思考足以涵盖所有基础。这似乎是正则表达式本身的一个常见陷阱(必须考虑所有可能使你的正则表达式得到误报的可能性)。它确实击败了原来的str_replace(' & ', ' & ', $string);:)

6 个答案:

答案 0 :(得分:17)

更好的是negative lookahead assertion来验证&没有后跟amp;

/&(?!amp;)/

虽然这会改变用于其他实体的任何&符号。如果你可能有其他人,那么如何

/&(?!#?[a-zA-Z0-9]+;)/

这将查找一个符号,但断言它后面没有可选的哈希符号(对于数字实体),一系列字母数字和一个分号,它应覆盖named and numeric entities,如&quote;ª

测试代码

$text="It’s 30 ° outside & very hot. T-shirt & shorts needed!";

$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text);

echo "$text\n";

将输出

It’s 30 ° outside & very hot. T-shirt & shorts needed!

更容易被读作“外面30°,非常热。需要T恤和短裤!”

替代PHP 5.2.3 +

正如Ionut G. Stan所指出的,从PHP 5.2.3开始,你可以使用htmlspecialchars和第四个参数 false 来防止双重编码,例如

$text=htmlspecialchars($text,ENT_COMPAT,"UTF-8",false);

答案 1 :(得分:2)

它将它应用于任何其他编码的字符。

答案 2 :(得分:2)

如果您的PHP版本是> = 5.2.3,您可以使用htmlspecialchars函数的第四个参数。设置为false时,它不会转换现有实体。

答案 3 :(得分:1)

在Perl中:

$content =~ s/&(?!\w+;)/&/g;

它使用了一个或多个单词字符的负向前瞻,意思是“一个&符号后面没有一个或多个单词字符,并且紧跟着一个分号。虽然使用os快捷键\ w不像特定的那样安全这个特殊情况的char范围。更好的选择是:

$content =~ s/&(?![a-z]+;)/&/g;

只是你的数据中有一些大写的动物:

$content =~ s/&(?![a-zA-Z]+;)/&/g;

答案 4 :(得分:0)

当您的文档中有其他实体时会发生什么?如果您正在谈论q& a会话会发生什么?

我会隔离&符号而不是猜测上下文,然后在替换字符串中使用反向引用

/(\W)&(\W)/$1&$2/

答案 5 :(得分:0)

如果字符'a'跟随&符号但不是“amp;”,则会失败喜欢和&和& apple ...

及(?安培)