如何使用preg_match从含比较符的字符串中提取指定数据?
解决正则匹配问题:提取带可选括号的指标、比较符、数值和时间
你原来的正则匹配失败主要是两个原因:
- 用
\w+匹配比较符,但>=、>这类运算符包含非单词字符,根本匹配不到 - 没考虑指标后面可能带括号注释(比如
(Link))的情况
这里给你调整后的正则,能同时兼容两种格式的字符串,直接用就行:
// 测试两种目标格式的字符串 $str1 = "CPC >= $0 (Yesterday)"; $str2 = "CPC (Link) > $0 (Today)"; // 修正后的正则表达式,覆盖常见比较运算符和可选括号注释 $pattern = '/(?<metric>\w+)(?: \(\w+\))? (?<sign>[<>]=?|==|!=) \$(?<digit>\d+) \((?<time>\w+)\)/'; // 匹配第一个字符串 preg_match($pattern, $str1, $matches1); echo "匹配第一种格式结果:\n"; print_r($matches1); // 匹配第二个字符串 preg_match($pattern, $str2, $matches2); echo "\n匹配第二种格式结果:\n"; print_r($matches2);
正则各部分解释(按需调整):
(?<metric>\w+): 捕获核心指标名称(比如CPC)(?: \(\w+\))?: 可选的非捕获组,用来匹配指标后面带括号的注释(比如(Link)),?表示这部分可以不存在,不影响核心匹配(?<sign>[<>]=?|==|!=): 捕获常见的比较运算符,目前覆盖了>、<、>=、<=、==、!=,如果有其他运算符可以直接加在这个字符组里\$(?<digit>\d+): 精准匹配$符号后面的数字(比如0)\((?<time>\w+)\): 捕获括号里的时间标识(比如Yesterday、Today)
运行输出示例:
匹配第一种格式结果: Array ( [0] => CPC >= $0 (Yesterday) [metric] => CPC [1] => CPC [sign] => >= [2] => >= [digit] => 0 [3] => 0 [time] => Yesterday [4] => Yesterday ) 匹配第二种格式结果: Array ( [0] => CPC (Link) > $0 (Today) [metric] => CPC [1] => CPC [sign] => > [2] => > [digit] => 0 [3] => 0 [time] => Today [4] => Today )
如果你的字符串里还有其他特殊情况(比如括号里有空格、数字是小数等),可以再调整正则~
内容的提问来源于stack exchange,提问作者code_together_today
相关产品推荐
相关产品推荐

