代码之家  ›  专栏  ›  技术社区  ›  Andreas Hunter

如何用一个替换多个?

  •  0
  • Andreas Hunter  · 技术社区  · 5 年前

    我有以下自定义文本和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;
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Wiktor Stribiżew    5 年前

    您可以使用

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

    PHP demo .

    详情

    • '/^((?:&nbsp;|\s)+)|(?1)$/' = & gt; '' 移除 &nbsp; 字符串开始/结束处的空白( (?1) 这里只是递归 (?:&nbsp;|\s)+ 是为了让图案短一点)
    • '/\s*&nbsp;(?:\s*&nbsp;)*\s*/' = & gt; '&nbsp;' 替换所有空格序列和 &nbsp; 至少有一个 &nbsp; 用一 &nbsp;
    • '/\s+/' = & gt; ' ' 将1+空格替换为1个正则空格。
        2
  •  0
  •   cfillion Xavier    5 年前

    您的输入文本在大多数 &nbsp; 你的正则表达式不解释。你可以使用 \s* 在每个不可拆分的空间html实体前后允许零个或多个空间。

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