【问题标题】:Replacing spaces using regex in PHP在 PHP 中使用正则表达式替换空格
【发布时间】:2010-09-17 12:10:42
【问题描述】:

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

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

我使用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

我很高兴使用正则表达式进行简单的文本替换,但我无法弄清楚如何在匹配中多次替换以获得我想要的输出。

【问题讨论】:

    标签: php regex replace preg-replace


    【解决方案1】:

    我想找到每个空格并替换它会更容易。为此,请使用“前瞻”和“后瞻”组。

    或者,找到一个空格(\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,因为 markdown 会解析 nbsp。)

    结果:

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

    如需了解更多信息,请查看PCRE 和perlre。


    回复 cmets

    @Sprogz:一开始我也是这么想的。但是该示例在第一行和第二行之间显示了"\n " =&gt; "\n&amp;nbsp;"。

    【讨论】:

    • 很好的答案,但是否值得改变你使用 \s 的建议,因为它只是提问者想要替换的空格序列,\s 当然包括制表符、换行符、回车符和其他一些启用某些设置。我会选择 /(?
    • 谢谢! /(?
    【解决方案2】:

    您可以使用 PHP 的 /e 修饰符来执行替换中的一些代码,如下所示:

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

    我已更改正则表达式以捕获空格。 /m 修饰符将其置于多行模式,因此^ 匹配任何行的开头。

    【讨论】:

      猜你喜欢
      • 2013-03-09
      • 2014-03-29
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多