【问题标题】:PHP replace first empty space between two strings (multiple occurrences)PHP替换两个字符串之间的第一个空格(多次出现)
【发布时间】:2020-12-08 21:21:04
【问题描述】:

使用 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 更多文本]。

也许完整的方法是错误的?如果可能的话,请用一个工作示例为我指明正确的方向。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    您不需要环顾四周。您可以匹配[ 后跟除[] 或空白字符之外的任何字符。

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

    如果要匹配 1 次或多次出现,可以使用带加号的量词\h+

    \[[^][\s]*\K\h
    

    在替换中使用点。

    regex demo


    正如@Wiktor Stribiżew 指出的那样,您可以使用积极的前瞻(?=[^][]*]) 断言关闭]

    更精确的模式是

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

    说明

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

    查看Regex demoPhp demo

    示例代码

    $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 more text] 的字符串,然后是一些其他文本 和 [foo1.bar1 更多文本]。

    【讨论】:

    • 为了确保空格实际上在[...] 之间,\[[^][\s]*\K\s+(?=[^][]*]) 会更精确一些
    • @WiktorStribiżew 哦,是的,真的
    • 感谢你们!是的,我必须确保空格实际上在[...] 之间。我花了这么多时间,关于否定字符类的解释是我理解的关键。
    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多