求PHP中preg_match_all匹配方括号标签内字符串的正则表达式
解决PHP preg_match_all提取vc_column_text标签内容的问题
嘿,我帮你排查下问题所在,然后给出可行的解决方案~
你的问题出在正则表达式的几个细节上:
- 正则里的
[和]是特殊元字符,用来定义字符集,你直接写[vc_column_text会被当成字符集处理,而不是匹配字面意义的方括号 - 原正则的定界符用了单引号,和字符串的单引号冲突,容易导致解析错误
- 匹配属性部分的
(.*?)太宽泛,可能会错误匹配到不属于标签的内容
正确的正则写法和代码示例
你可以用这个修正后的正则,结合preg_match_all来提取内容:
$string = '[vc_row][vc_column][/vc_column][/vc_row][vc_row][vc_column width="1/2"][vc_column_text css=".vc_custom_1576642149231{margin-bottom: 0px !important;}"]This is the string I want to fetch[/vc_column_text][/vc_column][/vc_row]'; // 使用~作为定界符,转义[],精确匹配标签属性和内容 preg_match_all('~\[vc_column_text[^\]]*\](.*?)\[/vc_column_text\]~s', $string, $matches); // 提取到的内容在$matches[1]里 print_r($matches[1]);
正则解释
~:作为正则的定界符,避免和字符串里的引号冲突\[vc_column_text:转义[,匹配开头的标签起始部分[^\]]*:匹配标签内的所有属性,意思是“匹配任意不是]的字符,0次或多次”,确保只会匹配到当前标签的属性部分(.*?):非贪婪匹配标签内的内容,避免跨标签匹配\[/vc_column_text\]:转义[和],匹配闭合标签s修饰符:让.可以匹配换行符(如果你的内容里有换行的话也能正确提取)
运行结果
执行上面的代码后,$matches[1]会输出:
Array ( [0] => This is the string I want to fetch )
这样就能准确获取到你想要的标签内的内容啦~
内容的提问来源于stack exchange,提问作者Jeram
相关产品推荐
相关产品推荐

