如何用preg_match_all实现排除特定内容的正则匹配?该技术术语是什么?
正则解决方案:排除特定模式的匹配
核心技术术语
这里用到的正则技术叫做正向否定预查(Negative Lookahead Assertion),属于正则断言的一种,作用是确保某个位置之后不会出现指定的字符串,且不会消耗匹配内容中的字符。
具体实现代码
修改原正则表达式,加入正向否定预查来过滤掉包含"hide":true的注释块:
preg_match_all('/"user":"(.*?)"(?:(?!"hide":true).)*?-->/s', $input_lines, $output_array);
正则逻辑拆解
"user":"(.*?)":精准匹配"user":"开头的片段,用非贪婪捕获组(.*?)提取用户名内容。(?:(?!"hide":true).)*?:这是实现过滤的核心部分:(?:...):非捕获分组,仅用于逻辑分组,不会额外存储匹配结果。(?!"hide":true):正向否定预查,断言当前位置之后不存在"hide":true这个字符串。.:匹配任意单个字符,搭配s修饰符时可以匹配换行符(适配多行注释)。*?:非贪婪匹配,保证匹配到第一个-->就停止,避免跨注释块的过度匹配。
-->:匹配HTML注释的结束标记。
结果验证
运行这段代码后,$output_array[1]会得到目标用户名列表:josh-hart、julius-randle、obi-toppin、mitch-robinson,完全符合需求。
内容的提问来源于stack exchange,提问作者pg.
相关产品推荐
相关产品推荐

