代码之家  ›  专栏  ›  技术社区  ›  Roman Ganz

在PHP中使用regex替换空格

  •  3
  • Roman Ganz  · 技术社区  · 16 年前

    我对正则表达式很陌生。我需要在一段多行文本中替换空格。替换规则如下:

    • 用不间断空格替换行首的所有空格(   )
    • 用相同数量的不间断空格替换重复空格(多个空格在一起)的任何实例。
    • 不在行首的单个空格保持不变。

    我用过 Regex Coach 要建立匹配模式:

    /( ){2,}|^( )/
    

    假设我有这个输入文本:

    asdasd asdasd  asdas1
     asda234 4545    54
      34545 345  34534
    34 345
    

    使用php正则表达式替换函数(如 preg_replace() ,我想得到这个输出:

    asdasd asdasd  asdas1
     asda234 4545    54
      34545 345  34534
    34 345
    

    我很乐意使用正则表达式进行简单的文本替换,但是我很难解决如何在匹配中多次替换以获得我想要的输出。

    2 回复  |  直到 9 年前
        1
  •  6
  •   Community CDub    8 年前

    我想找到并替换每个空间会更容易。要做到这一点,请使用“向前看”和“向后看”组。

    或者,找个地方( \x20 )这要么是前面的空格,要么后面跟着任何一个空格( \s )但是,只能替换空间。

    $str = "asdasd asdasd  asdas1\n asda234 4545    54\n  34545 345  34534\n34 345\n";
    
    print preg_replace("/(?<=\s)\x20|\x20(?=\s)/", "&#160;", $str);
    

    (由于降价分析,我选择了160英镑。)

    结果:

    asdasd asdasd&#160;&#160;asdas1
    &#160;asda234 4545&#160;&#160;&#160;&#160;54
    &#160;&#160;34545 345&#160;&#160;34534
    34 345
    

    有关详细信息,请查看 PCRE perlre .


    回复评论

    @ Sprogz 起初,我也是这么想的。但是这个例子显示了 "\n " => "\n&nbsp;" 在第一行和第二行之间。

        2
  •  2
  •   Greg    16 年前

    您可以使用PHP /e 修饰语 执行 替换中的一些代码,如:

    $str = preg_replace('/( {2,}|^ )/em', 'str_repeat("&nbsp;", strlen("\1"))', $str);
    

    我已经更改了正则表达式以捕获空格。 这个 /m 修改器将其设置为多行模式,因此 ^ 匹配任何行的开头。