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" 之类的东西,也
我正在尝试使用 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" 之类的东西,也