仅当rel =时,标记为href的正则表达式提取

时间:2013-09-30 15:04:31

标签: regex preg-match extract

如果rel =“external nofollow”,请帮助正则表达式从标记中提取href

<a href="text.html" rel="external nofollow">text1:text2:text3/</a>

只需要得到结果

text1:text2:text3

然后尝试

$regexp = '<a (?![^>]*?rel="external nofollow")[^>]*?href="(.*?)"';

我收到错误

Warning: preg_match() [function.preg-match]: Unknown modifier ']' in /

4 个答案:

答案 0 :(得分:3)

我强烈建议不要使用正则表达式来解析HTML这类任务。 HTML可能会有很大差异,您可能会得到意想不到的结果。

考虑像DOM parser in PHP一样使用此代码:

$html = '<a href="found.html" rel="external nofollow">text1:text2:text3/</a>
         <a href="notfound.html" rel="external">text11/</a>';
$doc = new DOMDocument();
$doc->loadHTML($html); // loads your html
$xpath = new DOMXPath($doc);
$nodelist = $xpath->query("//a[contains(@rel, 'external nofollow')]");
for($i=0; $i < $nodelist->length; $i++) {
   $node = $nodelist->item($i);
   echo $node->getAttribute('href') . "\n";
}

<强>输出:

found.html

答案 1 :(得分:3)

我建议您使用DOM来解析并获得所需的结果。以下是此示例。

<?php
$str = <<<STR
<a href="text.html" rel="external nofollow">foo bar</a>
<a href="text.html" rel="nofollow">text1:text2:text3/</a>
<a href="text.html" rel="nofollow">text1:text2:text3/</a>
<a href="example.html" rel="external nofollow">bar baz</a>
STR;

$dom = new DOMDocument;
$dom->loadHTML($str);

foreach ($dom->getElementsByTagName('a') as $node) {
   if ($node->getAttribute('rel') == 'external nofollow') {
     echo $node->getAttribute('href') . ', ' . $node->nodeValue . "\n"; 
   }
}
?>

示例输出:

text.html, foo bar
example.html, bar baz

答案 2 :(得分:1)

尝试

preg_match('/<a.*rel="external nofollow"[^>]*>([^<]*)</a>/i',
           $string_to_search_through, $res);
echo $res[1];

$res[1]会为您提供所需的文字。

答案 3 :(得分:0)

首先,你必须在你的正则表达式周围找到合适的分隔符,这里适当的分隔符是~

$regexp = '~<a (?![^>]*?rel="external nofollow")[^>]*?href="(.*?)"~';

其次,这个正则表达式将匹配锚标记之间的任何内容并捕获href中的链接,并且仅当锚标记中没有rel="external nofollow"时,我认为这与你的相反重新尝试。否定前瞻阻止匹配。您可能希望将该正则表达式完全更改为:

$regexp = '~<a[^>]*?rel="external nofollow"[^>]*>(.*?)</a>~';

相反。

regex101 demo