如何用一个替换多个和空白并将仅空白块缩小到一个空间?

时间:2019-04-02 10:23:28

标签: php regex string

我有以下自定义文本和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>"

代码:

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

2 个答案:

答案 0 :(得分:1)

您可以使用

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

请参见PHP demo

详细信息

  • '/^((?:&nbsp;|\s)+)|(?1)$/' => ''删除了字符串的开始/结尾处的&nbsp;和空格({(?1)在这里只是递归(?:&nbsp;|\s)+,在这里使图案短一些)
  • '/\s*&nbsp;(?:\s*&nbsp;)*\s*/' => '&nbsp;'用一个&nbsp;替换至少一个&nbsp;的所有空白序列和&nbsp;
  • '/\s+/' => ' '用1个常规空间替换1+个空格。

答案 1 :(得分:0)

您输入的文本包含大多数&nbsp;之后的空格,您的正则表达式不占空格。您可以使用\s*在每个不可中断的空间HTML实体前后允许零个或多个空间。

$result = preg_replace('/(\s*&nbsp;\s*)+/', '&nbsp;', $text);