抓取 A 元素的 href 属性
尝试在页面上查找链接。
我的正则表达式是:
/<a\s[^>]*href=(\"\'??)([^\"\' >]*?)[^>]*>(.*)<\/a>/
但似乎失败了
<a title="this" href="that">what?</a>
如何更改正则表达式来处理未放在 a 标记中的第一个 href?
尝试在页面上查找链接。
我的正则表达式是:
/<a\s[^>]*href=(\"\'??)([^\"\' >]*?)[^>]*>(.*)<\/a>/
但似乎失败了
<a title="this" href="that">what?</a>
如何更改正则表达式来处理未放在 a 标记中的第一个 href?
可靠的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
}
另请参阅:
旁注:我确信这是一个重复,你可以在这里的某个地方找到答案
我同意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"
}