preg_replace与单词之间的两个空格不匹配

时间:2013-07-30 21:30:04

标签: php regex preg-replace

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

则不起作用

有没有办法让正则表达式只与以冒号结尾的单词匹配?

$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是一个多行文字,因此有许多小写和大写的单词,但我只需要更改一些

2 个答案:

答案 0 :(得分:0)

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

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

此外,您知道,您可以使用星号指定无或多个空格字符:\s*

答案 1 :(得分:0)

你可以这样做:

$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+,以便在每个单词之间留出多个空格。