用正则表达式Negative Lookahead提取谷歌结果内层指定class div内容
正则修正方案
原代码问题根源
你标记行的写法存在两个核心问题:
- 多层嵌套分组叠加*量词会触发严重回溯,长文本下要么匹配超时要么结果异常
- 只对<开头的片段做负向预查,覆盖场景不全,无法兼容包含<的合法描述内容,也没法自动过滤外层嵌套的div结构
修正后完整代码
preg_match_all( '/<div class="BNeawe s3v9rd AP7Wnd">'. '(?:<span dir="rtl">)?'. '((?:(?!<\/(?:span|div)).)*)'. '(?:<\/span>)?'. '<\/div>/s', $gp, $desc );
调整说明
- 把不需要保留结果的分组改为非捕获组(以
?:开头),避免结果数组出现多余空项,最终提取到的描述内容统一存储在$desc[1]中 - 核心内容匹配逻辑改用负向预查先行校验:每匹配一个字符前都会确认后续不会出现
</span>或</div>标签,既允许描述内容中存在单独的<字符,也会自动过滤外层嵌套的div,直接匹配到最内层目标div的内容 - 末尾增加
s修饰符,让.可以匹配换行符,适配描述内容带换行的场景
内容的提问来源于stack exchange,提问作者babak golbaharan
相关产品推荐
相关产品推荐

