我需要一个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);
任何人都可以帮助我吗?
答案 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
答案 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);
(.*?)
任意数量的任意字符$1
\s{2,}
匹配两个或更多whitespaces s
flag使点匹配换行符可以使用一个漂亮的正则表达式,但更容易失败&解释需要更长时间像
这样的东西/(?::keyword_start:|\G(?!^)\S+)\K(?<!_end:)\s+/
答案 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);