preg_replace没有';单词之间不能有两个空格


preg_replace doesn't match with two spaces between words

我需要将大写单词格式化为粗体,但如果单词包含两个空格,则不起作用

有没有办法让regex只与以冒号结尾的单词匹配?

$str = "BAKA NO TEST: hey";    
$str = preg_replace('~[A-Z]{4,}'s[A-Z]'s{2,}(?:'s[A-Z]{4,})?:?~', '<b>$0</b>', $str);

输出:<b>BAKA NO TEST:</b> hey

但它返回<b>BAKA</b> NO TEST: hey

原始的$str是一个多行文本,因此有许多小写和大写单词,但我只需要更改一些

你可以这样做:

$txt = preg_replace('~[A-Z]+(?:'s[A-Z]+)*:~', '<b>$0</b>', $txt);

解释:

[A-Z]+      # uppercase letter one or more times
(?:         # open a non capturing group
    's      # a white character (space, tab, newline,...)
    [A-Z]+  #
)*          # close the group and repeat it zero or more times

如果你想要一个更宽容的模式,你可以用's+代替's,让每个单词之间有一个以上的空格。

除非您有充分的理由使用该regexp,否则请尝试更简单的方法,如:

/([A-Z's]+):/

此外,正如您所知,您可以使用星号指定一个或多个空格字符:'s*