为什么这个正则表达式不匹配?

时间:2009-08-24 02:33:47

标签: php regex

它应该匹配任何h1,h2或h3标签内的文本。

preg_match("<[hH][1-3][^>]*>(.*?)<[hH][1-3]>", $text, $matches);
echo $matches[0];

但它从未捕获任何东西。

4 个答案:

答案 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