如何编写正则表达式提取含//的组合词及对应描述?
PHP正则匹配处理
//分隔的大写词,生成多键对应同值的数组 我来帮你搞定这个问题!你现在的需求是从文本里提取大写词作为数组键,右侧的描述作为对应值,但遇到WORD//WORD 描述这种用//分隔的组合词时,原有代码没法让每个分隔后的词都对应同一个描述。下面一步步来解决:
示例文本
假设你的输入文本是这样的:
FOO//BAR//BAZ 这是一段描述文本 QUX 另一段描述
原有代码
你之前的代码大概是类似这样的(没法正确处理//分隔的情况):
$text = "FOO//BAR//BAZ 这是一段描述文本\nQUX 另一段描述"; $pattern = '/([A-Z]+) (.*)/'; preg_match_all($pattern, $text, $matches); $result = []; foreach ($matches[1] as $index => $key) { $result[$key] = $matches[2][$index]; } print_r($result);
错误结果
运行原有代码后,得到的错误结果只能匹配到第一个大写词,其他被//分隔的词都被忽略了:
Array ( [FOO] => 这是一段描述文本 [QUX] => 另一段描述 )
期望结果
你想要的正确结果应该是每个//分隔的大写词都对应同一个描述:
Array ( [FOO] => 这是一段描述文本 [BAR] => 这是一段描述文本 [BAZ] => 这是一段描述文本 [QUX] => 另一段描述 )
解决方案
我们需要修改正则表达式,先匹配所有用//分隔的大写词组合,再把它们拆分成单个键,最后对应到同一个描述上。
修正后的正则表达式
使用这个正则来匹配每行的内容:
/([A-Z]+(?:\/\/[A-Z]+)*) (.*)/m
正则解释:
[A-Z]+:匹配单个由大写字母组成的词(?:\/\/[A-Z]+)*:这是一个非捕获组,用来匹配任意多个//+大写词的组合,*表示这个组合可以出现0次或多次(这样既能匹配FOO//BAR//BAZ,也能匹配单个的QUX)- 整个捕获组1会拿到完整的大写词组合(比如
FOO//BAR//BAZ) (.*):匹配该行中大写词组合后面的所有描述文本,作为捕获组2- 末尾的
m是多行模式,确保每行的内容都能被正确匹配
修正后的PHP代码
$text = "FOO//BAR//BAZ 这是一段描述文本\nQUX 另一段描述"; // 匹配每行的大写词组合和对应的描述 $pattern = '/([A-Z]+(?:\/\/[A-Z]+)*) (.*)/m'; preg_match_all($pattern, $text, $matches); $result = []; foreach ($matches[1] as $index => $keyGroup) { // 把用//分隔的键拆分成单个键 $keys = explode('//', $keyGroup); $description = $matches[2][$index]; // 给每个键赋值同一个描述 foreach ($keys as $key) { $result[$key] = $description; } } print_r($result);
运行这段代码后,就能得到你期望的结果啦!
内容的提问来源于stack exchange,提问作者Andreas Hunter
相关产品推荐
相关产品推荐

