3

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

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

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

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

4

2 回答 2

6

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

或者,找到一个空格 ( \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

有关更多信息,请查看PCREperlre


回复评论

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

于 2008-10-16T10:48:33.927 回答
2

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

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

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

于 2008-10-16T10:49:22.757 回答