抓取 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"
}
 
				    		 
				    		 
				    		 
				    		