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 spaces
或multiple 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 删除两个单词之间的双空格的主要内容,如果未能解决你的问题,请参考以下文章