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'