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

时间:2016-02-27 13:14:35

标签: php regex between spaces

我需要一个Php-RegEx来查找start-keyword和end-keyword之间的所有双重空格并删除它们。

$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);

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

您可以使用\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

答案 1 :(得分:1)

您可以使用callback来处理单词之间的内容。

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

See demo at eval.in

可以使用一个漂亮的正则表达式,但更容易失败&解释需要更长时间像

这样的东西
/(?::keyword_start:|\G(?!^)\S+)\K(?<!_end:)\s+/

Demo at regex101

答案 2 :(得分:0)

嗯,我不擅长PHP,因此无论语言如何,我都会提供解决方案。这将非常有用,因为您可以选择语言并同样实施。

所以解决方案。那么在两个double space之间找到keywords是一种简单的方法。可能有一些精英正则表达式。但我的方法很简单。

第1步:使用keywords查找(?<=:keyword_start:).*?(?=:keyword_end:)之间的文字。

Regex101 Demo here.

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

Regex101 Demo here.

答案 3 :(得分:-1)

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

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

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

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

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