$str = "& &svnips  ∴ ≈ osidnviosd & sopinsdo";
$regex = "/&[^\w;]/";
echo preg_replace($regex, "&", $str);
我正在尝试用编码的替换所有未编码的&符号
问题是它删除了&
和sopinsdo
之间的空格。
知道为什么吗?
答案 0 :(得分:2)
您搜索2个字符(“&”和非字符(;或\ w))并将其替换为&
您应该替换为&
(在替换字符串末尾添加空格)
答案 1 :(得分:2)
为什么要使用正则表达式?为什么不使用htmlspecialchars()
?
echo htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8', false);
注意第四个参数。它告诉它不要对任何东西进行双重编码。基本上,这会将所有<
变为<
,将所有>
变为>
,将所有不属于现有实体的&
变为{{1} }}
但是,如果你必须使用正则表达式,你可以这样做:
&
基本上,它会保存非单词字符,然后将其添加回来......
答案 2 :(得分:1)
这个正则表达式可以满足您的需求。
preg_replace('/&(?!\w+;)/', '&', $text);
因此,对于一些简单的测试用例,您可以获得正确的转义HTML:
'& sopinsdo' -> '& sopinsdo'
'& sopinsdo' -> '& sopinsdo'
'sopinsdo & foo; bar' -> 'sopinsdo & foo; bar'
'sopinsdo &foo bar' -> 'sopinsdo &foo bar'
答案 3 :(得分:0)
因此,您不希望删除&amp; 和 sopinsdo 之间的空格。只需添加一个
echo preg_replace($regex, "& ", $str);