用不间断空格替换多个空格

5
如何在多个空格时替换除第一个(白色)空格以外的所有空格为 
特别是要求与php的preg_replace一起使用,因此需要使用PCRE。
"This is     my text."

应该被转换为

"This is     my text."

1
尝试使用 preg_replace("!\s+!", " ", $text);。你能提供一个例子吗? - Wiktor Stribiżew
也许您想要使用preg_replace("!\s{2,}!", " ", $text);函数。 - Wiktor Stribiżew
@WiktorStribiżew 上面的问题中提供了示例。 - toshniba
这是一个有趣的问题。我无法使用\G来实现它。但是我认为你可以使用preg_replace('~(?<=\s)\s~', '&nbsp;', $s) - 参见此演示 - Wiktor Stribiżew
3个回答

6
似乎你需要做的就是将每个前面有空格符的空格符替换掉。使用基于后顾预测的方法:
(?<=\s)\s

请查看正则表达式演示

(?<=\s)是一个正向后瞻,它要求当前位置之前紧跟一个空格,但该空格不会被匹配和替换。

下面是一个PHP演示

$s = "This is     my text.";
echo preg_replace('~(?<=\s)\s~', '&nbsp;', $s);
// => This is &nbsp;&nbsp;&nbsp;&nbsp;my text.

1

超过一个空格就是>=2

PHP代码演示

<?php

echo preg_replace("!\s{2,}!", " &nbsp;", "Welcome to stack  overflow");

输出:

Welcome to stack &nbsp;overflow

可能 OP 不想要 &nbsp; 前面的空格,替换应该是 "&nbsp;"(没有初始空格)。 - Wiktor Stribiżew

0
你需要做的是使用正则表达式前瞻和后顾,就像这样:

就像这样:

<?php
echo preg_replace("/\s(?=\s+)|(?<=\s)\s/", "&nbsp;", "Welcome to stack       overflow");

输出

Welcome to stack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;overflow

在这里测试它:https://regex101.com/r/DGraSS/1 - 提供了很好的解释 :)

这几乎是我需要的,但我会得到一个额外的&nbsp;(例如当有4个空格时为5,当有8个空格时为9)。并且最好保留第一个空格(“欢迎来到stack   ”)以允许在之前换行。 - toshniba
我刚在 PHP 7.x 下重新测试了一遍,空格的数量等于输出的 nbsp 的数量。 - aifrim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接