在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)
这将查找一个&符号,但断言它后面没有可选的哈希符号(对于数字实体),一系列字母数字和分号,它应该包括命名和数字实体,如"e;或ª
$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恤和短裤!"
正如Ionut G. Stan在下面指出的那样,从PHP 5.2.3开始,你可以使用htmlspecialchars和第四个参数false来防止双重编码,例如
$text=htmlspecialchars($text,ENT_COMPAT,"UTF-8",false);
Run Code Online (Sandbox Code Playgroud)