如何用preg_match_all提取MySQL文本字段中a标签的参数?
解决MySQL文章描述中提取标签属性的问题
你的问题出在正则表达式的贪婪匹配上,原代码里用的.*会尽可能匹配更多字符,导致属性值的提取范围超出预期。咱们来一步步修正:
原代码的问题
看你写的正则:/<a href="(?P<href>.*)" cat_id="(?P<cat_id>.*)" tab-id="(?P<tab_id>.*)">(?P<name>.*)<\/a>/
这里的.*是贪婪匹配,比如href="(?P<href>.*)"会把从http://mywebsite.com一直到tab-id="3"的所有内容都当成href的值,这显然不是你想要的结果。
修正后的代码
把.*替换成[^"]*(匹配除双引号外的任意字符),就能精准提取每个属性的内容了:
<?php $desc = '<a href="http://mywebsite.com" cat_id="156" tab-id="3">My name</a>'; // 修正正则,避免贪婪匹配 preg_match_all('/<a href="(?P<href>[^"]*)" cat_id="(?P<cat_id>[^"]*)" tab-id="(?P<tab_id>[^"]*)">(?P<name>[^<]*)<\/a>/', $desc, $return); print_r($return); ?>
关键调整说明
[^"]*:确保只提取双引号包裹的属性值,不会跨属性匹配(?P<name>[^<]*):用[^<]*匹配标签内的文本,避免误匹配到后面的</a>标签
进阶兼容(可选)
如果你的标签存在属性顺序不固定、属性间有多个空格/换行,或者标签大小写不一致的情况,可以用下面的正则,增强兼容性:
<?php $desc = '<A href="http://mywebsite.com" cat_id="156" tab-id="3">My name</a>'; // 兼容空白字符、标签大小写的正则 preg_match_all('/<a\s+href="(?P<href>[^"]*)"\s+cat_id="(?P<cat_id>[^"]*)"\s+tab-id="(?P<tab_id>[^"]*)">(?P<name>[^<]*)<\/a>/i', $desc, $return); print_r($return); ?>
这里的\s+匹配一个或多个空白字符(空格、换行、制表符),i修饰符忽略标签大小写。
运行修正后的代码,你就能得到正确提取的各个属性值了。
内容的提问来源于stack exchange,提问作者urbmake
相关产品推荐
相关产品推荐

