正则表达式匹配不匹配的HTML

时间:2011-04-21 08:30:38

标签: php regex

如何解析html中的某种链接样式而不将其分散到多个链接以匹配?

我想要匹配的确切链接是:

href="http://www.hotmail.com' rel='external nofollow"

要特别注意上面“和”的不匹配。

我尝试过:

if(preg_match('|href="http(.*?)\' rel=\'(.*?)"|i', $html)){
  echo "Found bad html\n";
}

然而,regexp在几个链接中也匹配完美的html。我需要能够只在一个链接中匹配。

1 个答案:

答案 0 :(得分:1)

您可以通过将通用.*?替换为负[^<"'>]+等字符类来调整正则表达式。这通常可以防止它吃太多。

if(preg_match('| href="(http[^<"\'>]+)\' rel=\'([^<"\'>]+)"|i', $html)){

更好的是:不要对"'进行硬编码,而是使用字符类来匹配它们:

if(preg_match('| href=["\']http([^<"\'>]+)["\']'
              .' rel=["\']([^<"\'>]*)["\']|i', $html)){

(哦,现在看起来很难看。)