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

PHP替换两个字符串之间的第一个空格(多次出现),php,regex,Php,Regex,使用PHP,我需要将两个字符串之间的第一个空格的多个实例替换为另一个字符串(在我的示例中为句点)。我确实找到了几个问题非常相似的帖子,但在这种情况下,似乎没有一个帖子对我有帮助:我似乎无法用正则表达式抓住[和]之间的第一个空白 $replacement = '.'; $str = 'Some string that contains [foo bar more text], then some other text and [foo1 bar1 more text].'; $str = preg

使用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;
$replacement=';
$str='一些字符串包含[foo-bar更多文本],然后是一些其他文本和[foo1-bar更多文本];

$str=preg_replace('/(?您不需要“lookarounds”。您可以匹配
[
,后跟任何字符,但
[
]
或空白字符除外

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

如果要匹配一个或多个实例,可以使用加号
\h+

\[[^][\s]*\K\h
在替换中使用点


正如@所指出的,您可以使用正向的前瞻
(?=[^][]*])

更精确的模式是

\[[^][\s]*\K\h(?=[^][]*])
解释

  • \[
    匹配
    [
  • [^][\s]*
    ,匹配除
    [
]或whitspace字符以外的任何字符的0+倍(如果在打开
[
之后必须至少有1个字符,请使用
+
而不是
*
  • \K\h
    清除匹配缓冲区并匹配水平空白字符
  • (?=[^][]*])
    正向前瞻,再次使用否定字符类断言右侧的是结束符
    ]
  • 看到一个或一个

    示例代码

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

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


    要确保空格实际上在
    […]
    之间,
    \[[^][\s]*\K\s+(?=[^][*])
    会稍微多一些precise@WiktorStribi是的,谢谢你们两位!是的,我必须确保空格实际上在
    […]之间
    。我在这方面花了很多时间,关于否定字符类的解释是我理解的关键。