如何用一个&nbsp替换多个&nbsp和空格,并将仅包含空格的块缩小为一个空格?

3
最初的回答:
我有以下自定义文本和HTML:

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

$text = "<p>Hello World!&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Javascript development&nbsp;PHP Developer&nbsp;</p>";

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

最初的回答:

"<p>Hello World!&nbsp;Javascript development&nbsp;PHP Developer</p>"

Code:

$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;

1
你尝试了什么?在问题中包含你的代码(不要作为链接)。你遇到了什么问题? - Jonathan Hall
尝试使用preg_replace(["/\s*&nbsp;(?:\s*&nbsp;)*\s*/", "/\s+/"], ['&nbsp;',' '], $text)进行替换(演示)。 - Wiktor Stribiżew
https://dev59.com/Ap_ha4cB1Zd3GeqP3LbU#42602323 - Learner
@WiktorStribiżew 你的正则表达式部分有效。如何添加一个规则,使文本的开头和结尾没有 &nbsp - Andreas Hunter
1
https://dev59.com/Ap_ha4cB1Zd3GeqP3LbU#42602323与当前问题无关,因为它不涉及将多个连续的单词缩减为一个出现。 - Wiktor Stribiżew
显示剩余3条评论
2个回答

2
您输入的文本在大多数&nbsp;后面包含空格,而您的正则表达式没有考虑到这一点。您可以使用\s*来允许每个不间断空格HTML实体前后有零个或多个空格。
$result = preg_replace('/(\s*&nbsp;\s*)+/', '&nbsp;', $text);

2

您可以使用

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

"最初的回答"的翻译:
请查看PHP演示细节
  • '/^((?:&nbsp;|\s)+)|(?1)$/' => '',去除字符串开头/结尾处的&nbsp;和空格((?1)在此处仅递归(?:&nbsp;|\s)+,以使模式更短)
  • '/\s*&nbsp;(?:\s*&nbsp;)*\s*/' => '&nbsp;',用一个&nbsp;替换所有至少有一个&nbsp;和空格的序列。
  • '/\s+/' => ' ',将一个或多个空格替换为一个普通空格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接