我试图使用preg_replace或类似的php函数来: - 识别字符串中的第一个全部大写字母, - 并在其后直接插入一个字符(破折号或分号) - 全部大写字母长度应为3个字符或更长。
到目前为止,我有正则表达式:
/(?<!\ )([^A-Z{3,}])/
但是,这不仅仅是3个字符的单词。我也不确定我是否严格遵守&#39;只看第一个字。
我相信一旦我将正则表达式整理出来 - 这个
$string = "LONDON On November 12th twelve people...";
$replaced_string = preg_replace('/myregex/',': ', $string);
将输出如下
LONDON: On November 12th twelve people..."
答案 0 :(得分:5)
这是一个相当简单的正则表达式,真的:
$replacedString = preg_replace('/\b([A-Z]{3,})\b/', '$1: ', $string);
它的工作原理如下:
\b
:字边界。这会检测&#34; word&#34; ([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,等等...
根据您的示例字符串判断,大写单词是城市名称。城市名称可能包含短划线,甚至是空格。要解决此问题,您可能希望匹配包含大写字符,短划线和空格的所有字符串:
$replaceAll = preg_replace('/\b([A-Z -]{2,}[A-Z])\b/', '$1: ', $string);
发生了什么变化:
([A-Z -]{2,}
:捕获匹配从大写字符开始(2个或更多,而不是3),但也匹配空格和短划线。[A-Z])
:捕获的组的最后一个字符必须是一个大写字符,这样可以避免捕获尾随空格或短划线。结果是我们捕获了诸如&#34;纽约&#34; 或&#34; FOO-TOWN&#34; 之类的东西,但不是&# 34; ON - Something&#34; 。其余的与以前一样。如果要允许可能出现的其他字符(如点),只需将它们添加到捕获组的第一部分即可。最完整的模式可能是这样的:
$replaced = preg_replace('/\b([A-Z][A-Z .-]+[A-Z])\b/', '$1: ', $string);
这可确保捕获的组开始,并以大写字符结尾,并在其间包含任意数量的大写字符,空格,点和短划线。所以这将匹配像&#34; ST这样的东西。 LEWIS&#34; ,