PHP RegEx 删除两个单词之间的双空格

Posted

技术标签:

【中文标题】PHP RegEx 删除两个单词之间的双空格【英文标题】:PHP RegEx to remove double spaces between 2 words 【发布时间】:2016-06-10 18:16:57 【问题描述】:

我需要一个 php-RegEx 来查找开始关键字和结束关键字之间的所有双空格并删除它们。

$teststring = 'This is a teststring ... :keyword_start: this is    the content    with double spaces :keyword_end: more text ... :keyword_start: this is the second   content    with double spaces :keyword_end: ... more text';

我需要以下结果:

This is a teststring ... :keyword_start: this is the content with double spaces :keyword_end: more text ... :keyword_start: this is the second content with double spaces :keyword_end: ... more text

这是我尝试过的:(但它不起作用)

$teststring = preg_replace('#(:keyword_start:)\s\s+(:keyword_end:)#si', '', $teststring);

谁能帮帮我?

【问题讨论】:

试试这个http://***.com/questions/2368539/php-replacing-multiple-spaces-with-a-single-space 【参考方案1】:

如果你想用正则表达式替换所有空格,包括制表符和空行,你可以使用这个:

$s = preg_replace('/\s+/', ' ', $s);

它会替换 TAB 和换行符,即使它只有一个,字符之间。多个(任何)空格也将减少为一个空格字符。

这里只有多个空格的正则表达式(但在这种情况下使用 str_replace 会更快,就像这里的另一个答案一样)

$s = preg_replace('/  */', ' ', $s);

【讨论】:

【参考方案2】:

好吧,我不擅长 php,因此我会给出一个解决方案,而不管语言如何。这将很有帮助,因为您可以选择您的语言并同样实现它。

所以解决方案。好吧,在两个keywords 之间找到double space 并不容易。可能有一些 elite 正则表达式。但我的方法非常简单。

第一步:找到keywords之间的文字,使用(?<=:keyword_start:).*?(?=:keyword_end:)实现。

Regex101 Demo here.

第 2 步:使用简单的\s+ 替换找到的文本中的double spacesmultiple tabs

Regex101 Demo here.

【讨论】:

【参考方案3】:

您可以使用\G 锚点来使用这种模式。此锚点匹配上一次匹配之后的位置(默认情况下是字符串的开头)。有了它,您可以获得连续匹配(直到您破坏连续性):

$pattern = '~(?:\G(?!\A)|:keyword_start:\s)(?:(?!:keyword_end:)\S+\s)*+\K\s+~S';

$result = preg_replace($pattern, '', $str);

图案细节:

~             # pattern delimiter
(?:           # non-capturing group
    \G(?!\A)             # contiguous branch (not at the start of the string)
  |                      # OR
    :keyword_start:\s    # start branch
)
(?:
    (?!:keyword_end:)\S+ # all non-blank characters that are not the "end word"
    \s                   # a single space
)*+                   # repeat the group until a double space or the "end word"
\K                    # remove all on the left from the match result
\s+                   # spaces to remove
~S      # "STUDY" modifier to improve non anchored patterns

demo

【讨论】:

【参考方案4】:

您可以在单词之间使用callback。

$str = preg_replace_callback('/:keyword_start:(.*?):keyword_end:/s', function ($m) 
  return ':keyword_start:' . preg_replace('/\s2,/', " ", $m[1]) . ':keyword_end:';
, $str);
(.*?) 之间的标记 captures lazily 任意数量的任意字符到 $1 \s2, 匹配两个或更多 whitespaces s flag 关闭分隔符后使点匹配换行符

See demo at eval.in


这可以用一个漂亮的正则表达式来完成,但更容易失败并且解释需要更长的时间。类似的东西

/(?::keyword_start:|\G(?!^)\S+)\K(?<!_end:)\s+/

Demo at regex101

【讨论】:

以上是关于PHP RegEx 删除两个单词之间的双空格的主要内容,如果未能解决你的问题,请参考以下文章

RegEx Tokenizer:将文本拆分为单词、数字、标点和空格(不要删除任何内容)

删除字符和单词之间的空格[重复]

删除字符串中的一个单词(或两个空格之间)

REGEX 删除空格或破折号,如果它们在数字之间

删除重复的单词、逗号和空格

删除非单词之间的所有空格?