抓取 A 元素的 href 属性

2022-08-30 07:16:57

尝试在页面上查找链接。

我的正则表达式是:

/<a\s[^>]*href=(\"\'??)([^\"\' >]*?)[^>]*>(.*)<\/a>/

但似乎失败了

<a title="this" href="that">what?</a>

如何更改正则表达式来处理未放在 a 标记中的第一个 href?


答案 1

可靠的HTML正则表达式是困难的。以下是使用DOM执行此操作的方法

$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
    echo $dom->saveHtml($node), PHP_EOL;
}

上面将查找并输出字符串中所有元素的“outerHTML”。A$html

获取节点的所有文本值,您需要

echo $node->nodeValue; 

检查该属性是否存在,您可以执行href

echo $node->hasAttribute( 'href' );

获取属性,您需要执行的操作href

echo $node->getAttribute( 'href' );

更改要执行的属性href

$node->setAttribute('href', 'something else');

要删除您要执行的属性href

$node->removeAttribute('href'); 

您还可以使用 XPath 直接查询属性href

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//a/@href');
foreach($nodes as $href) {
    echo $href->nodeValue;                       // echo current attribute value
    $href->nodeValue = 'new value';              // set new attribute value
    $href->parentNode->removeAttribute('href');  // remove attribute
}

另请参阅:

旁注:我确信这是一个重复,你可以在这里的某个地方找到答案


答案 2

我同意Gordon的观点,你必须使用HTML解析器来解析HTML。但是如果你真的想要一个正则表达式,你可以试试这个:

/^<a.*?href=(["\'])(.*?)\1.*$/

这在字符串的开头匹配,后跟任意数量的任意字符(非贪婪),然后是由 或 括起来的链接<a.*?href="'

$str = '<a title="this" href="that">what?</a>';
preg_match('/^<a.*?href=(["\'])(.*?)\1.*$/', $str, $m);
var_dump($m);

输出:

array(3) {
  [0]=>
  string(37) "<a title="this" href="that">what?</a>"
  [1]=>
  string(1) """
  [2]=>
  string(4) "that"
}

推荐