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

ale*_*lex 4 php regex

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

/&(?=[^a])/
Run Code Online (Sandbox Code Playgroud)

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

基本上它需要转换&&&保持&原样(以免得到&)

谢谢

更新

谢谢你的回答.看来我并没有足够广泛地覆盖所有基地.这似乎是正则表达式本身的常见陷阱(必须考虑所有可能使你的正则表达式得到误报的可能性).它确实打败了我原来的str_replace(' & ', ' & ', $string); :)

Pau*_*xon 17

更好的是负面的先行断言来验证&不跟随放大器;

/&(?!amp;)/
Run Code Online (Sandbox Code Playgroud)

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

/&(?!#?[a-zA-Z0-9]+;)/
Run Code Online (Sandbox Code Playgroud)

这将查找一个&符号,但断言它后面没有可选的哈希符号(对于数字实体),一系列字母数字和分号,它应该包括命名和数字实体,&quote;ª

测试代码

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

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

echo "$text\n";
Run Code Online (Sandbox Code Playgroud)

哪个会输出

It’s 30 ° outside & very hot. T-shirt & shorts needed!
Run Code Online (Sandbox Code Playgroud)

更容易理解为"外面30度非常热.需要T恤和短裤!"

PHP 5.2.3+的替代方案

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

$text=htmlspecialchars($text,ENT_COMPAT,"UTF-8",false);
Run Code Online (Sandbox Code Playgroud)