我正在尝试使用 preg_replace 或类似的 php 函数来: - 识别字符串中第一个全大写字母的单词, - 并在其后面直接插入一个字符(破折号或分号即可) - 全大写字母的单词长度应为 3 个字符或更多。
到目前为止我有正则表达式:
/(?<!\ )([^A-Z{3,}])/
但是,这仅适用于 3 个以上字符的单词。我也不确定我是否“严格”只看第一个单词。
我相信一旦我整理好正则表达式 - 这
$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/', '$1: ', $string);
它的工作原理如下:
\b
:字边界。这会检测“单词”的开头和结尾([A-Z]{3,})
:匹配3个或更多大写字符。括号捕获了匹配的这一部分,因此我们可以在替换字符串中使用它\b
:另一个单词边界
将此匹配替换为:
'$1: '
:$1
引用第一个捕获的组(3 个或更多大写字符)。为此,我们添加一个冒号和一个空格。这将是我们的替换字符串
这将在 所有 3 个或更多字符的大写单词后面添加冒号和空格。要仅替换 1 个单词,只需向 preg_replace
传递一个限制:
$replaced = preg_replace('/\b([A-Z]{3,})\b/', '$1: ', $string, 1);
最后一个参数是您要替换的匹配项的数量。 -1 代表全部,1 代表 1,2 代表 2,等等...
Demo
根据您的示例字符串判断,大写单词是城市名称。城市名称可能包含破折号,甚至空格。为了解决这个问题,您可能需要匹配所有包含大写字符、破折号和空格的字符串:
$replaceAll = preg_replace('/\b([A-Z -]{2,}[A-Z])\b/', '$1: ', $string);
Demo 2
发生了什么变化:
([A-Z -]{2,}
:捕获匹配以大写字符(2 个或更多,而不是 3 个)开头,但也匹配空格和破折号。[A-Z])
:捕获组的最后一个字符必须是大写字符,这样可以避免捕获尾随空格或破折号。结果是我们捕获了诸如“NEW YORK”或“FOO-TOWN”之类的内容,而不是“ON - Something”。。
其余与之前相同。如果您想允许可能出现的其他字符(如点),只需将它们添加到捕获组的第一部分即可。最完整的模式可能是这样的:
$replaced = preg_replace('/\b([A-Z][A-Z .-]+[A-Z])\b/', '$1: ', $string);
这可确保捕获的组以大写字符开始和结束,并在其间包含任意数量的大写字符、空格、点和破折号。因此,这也将匹配“ST. LEWIS”之类的内容
关于Php正则表达式在字符串中的第一个全大写字母单词后插入字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34271227/