PHP替换了两个字符串之间的第一个空白(多次出现)

时间:2020-08-19 14:59:36

标签: php regex

使用PHP,我需要将两个字符串之间的第一个空白的多个实例替换为另一个字符串(在我的示例中为句点)。我确实找到了几个问题非常相似的帖子,但在这种情况下似乎都没有帮助:我似乎无法抓住 [] 之间的第一个空白区域使用正则表达式。

$replacement = '.';
$str = 'Some string that contains [foo bar more text], then some other text and [foo1 bar1 more text].';
$str = preg_replace('/(?<=\[)\s(?=\])/U', $replacement, $str);
echo $str;

结果

一些字符串,其中包含[foo bar more text],然后包含其他一些文本和[foo1 bar1 more text]。

我正在寻找的输出:

某些字符串包含[foo.bar更多文本],然后包含其他一些文本和[foo1.bar1更多文本]。

也许完整的方法是错误的?如果可能的话,请通过正确的例子向我指出正确的方向。

1 个答案:

答案 0 :(得分:1)

您不需要环顾四周。您可以匹配expect(received).toEqual(expected) // deep equality Expected: true Received: {} //expect(wrapper.contains(name)).toEqual(true); //expect(wrapper.find('.link')).to.have.lengthOf(0); expect(wrapper.find('.h1')).toEqual(true); ^ }); ,然后匹配除[[以外的任何字符或空白字符。

使用]清除匹配缓冲区并匹配水平空白字符\K,或使用\h匹配也可以换行的空白字符。

如果要匹配1个或多个匹配项,可以使用加号\s

使用量词
\h+

在替换中使用点。

regex demo


正如@ {Wiktor Stribiżew所指出的那样,您可以使用正向超前\[[^][\s]*\K\h 来断言]

更精确的模式是

(?=[^][]*])

说明

  • \[[^][\s]*\K\h(?=[^][]*]) 匹配\[
  • [ Negated character class,将除[^][\s]* [或whitspace char 以外的任何字符匹配0+倍(使用]代替{{1 }},如果在开头+之后必须至少包含1个字符,则
  • *清除匹配缓冲区并匹配水平空白字符
  • [前瞻性,断言右边是使用否定字符类再次结束的\K\h

查看Regex demoPhp demo

示例代码

(?=[^][]*])

输出

一些包含[foo.bar更多文本]的字符串,然后是其他一些文本 和[foo1.bar1更多文字]。

相关问题