Php 正则表达式在字符串中第一个全大写字母单词后插入字符

Php Regex to insert character after first all-capital letter word in a string

我正在尝试使用 preg_replace 或类似的 php 函数来: - 识别字符串中第一个全大写字母的单词, - 并在其后直接插入一个字符(破折号或分号即可) - 所有大写字母的单词长度应为3个字符或更多。

到目前为止我有正则表达式:

/(?<!\ )([^A-Z{3,}])/

但是,这仅适用于 3 个以上字符的单词。我也不确定我有它 'strictly' 只看第一个字。

我相信一旦我整理好正则表达式 - 这个

$string = "LONDON On November 12th twelve people...";
$replaced_string = preg_replace('/myregex/',': ', $string);

会输出如下

LONDON: On November 12th twelve people..."

这是一个相当简单的正则表达式,真的:

$replacedString = preg_replace('/\b([A-Z]{3,})\b/', ': ', $string);

它是这样工作的:

  • \b:字界。这会检测 "word"
  • 的开始和结束
  • ([A-Z]{3,}):匹配3个或更多的大写字符。括号捕获了匹配的这一部分,因此我们可以在替换字符串中使用它
  • \b: 另一种词界

将此匹配替换为:

  • ': '</code> 指回第一个捕获的组(3 个或更多大写字符)。为此,我们添加了一个冒号和一个 space。那将是我们的替换字符串</li> </ul> <p>这将在<strong><em>所有</em></strong> 3 个或更多字符的大写单词后添加冒号和space。要仅替换 1 个单词,只需将限制传递给 <code>preg_replace:

    $replaced = preg_replace('/\b([A-Z]{3,})\b/', ': ', $string, 1);
    

    最后一个参数是您要替换的匹配项数。 -1 代表所有,1 代表 1,2 代表 2,等等...

    Demo

    根据您的示例字符串判断,大写单词是城市名称。城市名称可以包含破折号,甚至 space。要解决这个问题,您可能希望匹配所有包含大写字符、破折号和 spaces:

    的字符串
    $replaceAll = preg_replace('/\b([A-Z -]{2,}[A-Z])\b/', ': ', $string);
    

    Demo 2

    改变了什么:

    • ([A-Z -]{2,}:捕获匹配以大写字符(2 个或更多,而不是 3 个)开头,但也匹配 spaces 和破折号。
    • [A-Z]):捕获组的最后一个字符必须是大写字符,这样可以避免捕获结尾的spaces或破折号。结果是我们捕获了 "NEW YORK""FOO-TOWN" 之类的东西,但没有捕获 "ON - Something".

    其余同上。如果您想允许可能出现的其他字符(如点),只需将它们添加到捕获组的第一部分。最完整的模式可能是这样的:

    $replaced = preg_replace('/\b([A-Z][A-Z .-]+[A-Z])\b/', ': ', $string);
    

    这确保捕获的组以大写字符开始和结束,并且包含任意数量的大写字符、spaces、点和破折号之间。所以这将匹配 "ST. LEWIS" 之类的东西,也