它应该匹配任何h1,h2或h3标签内的文本。
preg_match("<[hH][1-3][^>]*>(.*?)<[hH][1-3]>", $text, $matches);
echo $matches[0];
但它从未捕获任何东西。
答案 0 :(得分:6)
你错过了标签末尾和正则表达式周围的正斜杠。试试这个:
preg_match("/<[hH][1-3][^>]*>(.*?)<\/[hH][1-3]>/", $text, $matches);
echo $matches[0];
您的正则表达式正在寻找<h1>Text<h1>
而不是<h1>Text</h1>
。添加斜杠将捕获实际的HTML。
答案 1 :(得分:5)
你需要使用正则表达式分隔符,而不是那些你正在使用(尖括号)进行清理的分隔符。并且关闭标签上的斜线。我还建议捕获开始标记并要求结束标记相同。
preg_match('!<(h[1-3])[^>]*>(.*?)</\1>!i', $text, $matches);
echo $matches[1];
答案 2 :(得分:0)
至少,你在正则表达式中缺少分隔符:
preg_match("/<[hH][1-3][^>]*>(.*?)<[hH][1-3]>/", $text, $matches);
echo $matches[0];
答案 3 :(得分:0)
我对Eric的代码做了一些改进。现在它匹配< h2 ><h1></h1></ h2 >
(不是这应该发生)。仍然存在一些问题,例如尝试<h1><!--</h1>--></h1>
。
preg_match("/<\s*[hH]([1-3])\s*>(.*?)<\/\s*[hH]\1\s*>/", $text, $matches);
echo $matches[0]; // the entire matched string
echo $matches[2]; // the contents between the tags