如何用正则表达式提取标签名称?匹配失败求助
修复正则表达式提取标签名称
原正则的问题
你的原正则存在几个关键错误:
- 闭合标签匹配逻辑颠倒:原正则里的
/\1试图匹配/[B],但实际闭合标签格式是[/B],应该先匹配[/再引用标签名,最后匹配]。 - 捕获组目标错误:你捕获的是整个带括号的开标签(比如
[B]),而非我们需要的标签名称本身(B)。 U修饰符多余:非贪婪修饰符在这里会干扰匹配逻辑,没必要添加。
有效的正则表达式
要提取所有成对出现的标签名称,正确的正则表达式如下:
$expr = '~\[([a-z]+)\].*?\[/\1\]~i';
正则各部分解析
\[([a-z]+)\]:匹配开标签,捕获括号内的标签名称([a-z]+匹配1个及以上字母,i修饰符忽略大小写)。.*?:非贪婪匹配标签之间的内容,避免出现跨标签的错误匹配。\[/\1\]:匹配对应的闭合标签,\1引用前面捕获的标签名称,确保开闭标签一致。
完整代码示例
$str = "Lorem ipsum [B]dolor[/b] sit amet, consectetur adipiscing elit. Aenean vestibulum orci sed ante malesuada vulputate. [Link]In tempus[/Link], lacus eu luctus fringilla, ligula dui scelerisque justo, sit amet mollis velit turpis a nunc. Pellentesque interdum risus quis nisl vestibulum congue. Nam vel dolor [i]sit[/i] amet urna eleifend consequat eget tincidunt neque. Maecenas sed justo sed dolor rhoncus malesuada. Maecenas ut mauris eu sem auctor viverra eu non mi. Duis in enim nec orci molestie facilisis. Vivamus sit amet maecenas porttitor urna. Maecenas cursus fermentum bibendum. Sed a nulla lectus, nec eleifend magna. Sed eu turpis non tortor ornare vestibulum eu eget risus."; $expr = '~\[([a-z]+)\].*?\[/\1\]~i'; preg_match_all($expr, $str, $found); // 输出捕获的标签名称 print_r($found[1]);
运行后,$found[1]会返回:Array ( [0] => B [1] => Link [2] => i ),即所有成对出现的标签名称。
补充:提取所有出现过的标签(含未闭合)
如果需要提取文本中所有出现过的标签(不管是否闭合),可以用更简化的正则:
$expr = '~\[(/?)([a-z]+)\]~i'; preg_match_all($expr, $str, $found); // 去重后得到唯一标签列表 $tags = array_unique($found[2]); print_r($tags);
内容的提问来源于stack exchange,提问作者Petro Gromovo
相关产品推荐
相关产品推荐

