Php 为什么我的正则表达式要删除空格?

Php 为什么我的正则表达式要删除空格?,php,regex,Php,Regex,我正在尝试用编码的符号替换所有未编码的符号和。 问题是它正在删除&和sopindo之间的空格 知道原因吗?搜索2个字符(&)和一个非(;或\w)字符,并将其替换为& 您应该替换为&(在替换字符串的末尾添加一个空格)因此您不希望删除&和sopindo之间的空格。加一个就行了 $str = "& &svnips   Â ∴ ≈ osidnviosd & sopinsdo";

我正在尝试用编码的符号替换所有未编码的符号和。
问题是它正在删除
&
sopindo
之间的空格


知道原因吗?

搜索2个字符(&)和一个非(;或\w)字符,并将其替换为
&


您应该替换为
&(在替换字符串的末尾添加一个空格)

因此您不希望删除&sopindo之间的空格。加一个就行了

$str = "& &svnips   Â ∴ ≈ osidnviosd & sopinsdo";   
$regex = "/&[^\w;]/";
echo preg_replace($regex, "&", $str);

为什么要使用正则表达式?为什么不使用

注意第四个参数。它告诉它不要对任何东西进行双重编码。因此,基本上,这将把所有
转换成
,把所有不属于现有实体的
&
转换成
&

但是,如果必须使用正则表达式,可以执行以下操作:

echo htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8', false);

基本上,它会保存非单词字符,然后再将其添加回…

这个正则表达式执行您要查找的操作

$regex = '/&([^\w;])/';
echo preg_replace($regex, '&\1', $str);
因此,对于一些简单的测试用例,您可以获得正确转义的HTML:

preg_replace('/&(?!\w+;)/', '&', $text);

这与下面unigg的回答有相同的问题。在某些情况下,这将导致不期望的行为。
preg_replace('/&(?!\w+;)/', '&', $text);
'& sopinsdo'          -> '& sopinsdo'
'& sopinsdo'      -> '& sopinsdo'
'sopinsdo & foo; bar' -> 'sopinsdo & foo; bar'
'sopinsdo &foo bar'   -> 'sopinsdo &foo bar'