在PHP中,我想编码尚未编码的&符号。我想出了这个正则表达式
/&(?=[^a])/
到目前为止似乎运作良好,但看到我不是一个正则表达式专家,我问这个正则表达式是否有任何潜在的陷阱?
基本上,它需要将&
转换为&
,但将&
保留在&
中(以便不&
)
由于
感谢您的回答。似乎我并没有思考足以涵盖所有基础。这似乎是正则表达式本身的一个常见陷阱(必须考虑所有可能使你的正则表达式得到误报的可能性)。它确实击败了原来的str_replace(' & ', ' & ', $string);
:)
答案 0 :(得分:17)
更好的是negative lookahead assertion来验证&没有后跟amp;
/&(?!amp;)/
虽然这会改变用于其他实体的任何&符号。如果你可能有其他人,那么如何
/&(?!#?[a-zA-Z0-9]+;)/
这将查找一个符号,但断言它后面没有可选的哈希符号(对于数字实体),一系列字母数字和一个分号,它应覆盖named and numeric entities,如"e;
或ª
$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恤和短裤!”
正如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 ...
及(?安培)