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

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

我用的是 正则表达式教练 构建匹配模式:

/( ){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

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

有帮助吗?

解决方案

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

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

欲了解更多信息,请查看 聚合酶链式反应佩尔雷.


回复评论

@斯普罗兹: :一开始我也是这么想的。但该示例显示了 "\n " => "\n&nbsp;" 第一行和第二行之间。

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top