Php 如何替换多个&;nbsp和带一的空白;nbsp并将仅空白块压缩为一个空格?

Php 如何替换多个&;nbsp和带一的空白;nbsp并将仅空白块压缩为一个空格?,php,regex,string,Php,Regex,String,我有以下自定义文本和HTML: $text = "<p>Hello World!&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Javascript development&nbsp;PHP Developer&nbsp;</p>"; $text=“你好,世界!Javascript开发PHP开发者””; 如何使用正则表达式将该文本更改为以下内容: "

我有以下自定义文本和HTML:

$text = "<p>Hello World!&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Javascript development&nbsp;PHP Developer&nbsp;</p>";
$text=“你好,世界!Javascript开发PHP开发者”

”;
如何使用正则表达式将该文本更改为以下内容:

"<p>Hello World!&nbsp;Javascript development&nbsp;PHP Developer</p>"
“你好,世界!Javascript开发PHP开发者

代码:

$text = "<p>Hello World!&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Javascript development&nbsp;PHP Developer&nbsp;</p>";
$result = preg_replace("/(&nbsp;)+/", "&nbsp;", $text);
echo $result;
$text=“你好,世界!Javascript开发PHP开发者”

”; $result=preg_replace(“/()+/”,“”,$text); 回声$结果;
您的输入文本在大多数
之后包含空格,而您的正则表达式不考虑这些空格。您可以使用
\s*
在每个不可断开的空格HTML实体之前和之后允许零个或多个空格

$result=preg_replace(“/(\s*\s*)+/”,“,$text);
您可以使用

$find = ['/^((?:&nbsp;|\s)+)|(?1)$/', '/\s*&nbsp;(?:\s*&nbsp;)*\s*/', '/\s+/'];
$replace = ['', '&nbsp;',' '];
$text = preg_replace($find, $replace, trim($text));

详细信息

  • '/^((?:|\s)+)|(?1)$/'
    =>
    '
    删除字符串开头/结尾的
    和空格(
    (?1)
    此处仅递归
    (?:|\s)+
    ,并将模式缩短一点)
  • '/\s*(?:\s*)*\s*/'
    =>
    '
    将所有空格序列替换为至少一个
    和一个
  • '/\s+/'
    =>
    '
    将1+空格替换为1个常规空格

您尝试过什么?包括您的代码(在问题中,而不是作为链接!)。您遇到了什么问题?请尝试
preg\u replace([“/\s*(?:\s*)*\s*/”、“/\s+/”]、[“,”、“,”、$text)
()@WiktorStribiżew您的regexp部分工作。如何添加这样一条规则,使文本开头和结尾没有
?与当前问题无关,因为它不是将多个连续的单个单词缩减为一个出现。