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

标签 php regex string preg-replace

我正在尝试使用 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/

相关文章:

php - 如何选择帖子类型(WordPress)以通过头部过滤器?

java - 删除java中的所有特殊字符

javascript - string.match() 与未知长度的通配符

Java - 正则表达式中的转义 + 字符

android - strings.xml 中的法语措辞

php - 用于从表单中获取值的动态表单类

php - 身份验证返回 false Laravel 4

php - 如果 use_controller 设置为 true,则 Assetic 不起作用

c# - 删除 HTML 标签的正则表达式

java - java中大的负十六进制值转换为long