抓取A元素的href属性

试图找到页面上的链接。

我的正则表达式是:

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

但似乎失败了

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

我如何改变我的正则表达式来处理不是首先放在标签中的href?


HTML的可靠正则表达式很困难。 以下是如何使用DOM做到这一点:

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

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

获取节点的所有文本值,请执行

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
}

另请参阅:

  • 解析HTML的最佳方法
  • DOM中的DOMDocument
  • 在旁注中:我确信这是重复的,你可以在这里找到答案


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

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

    这与字符串开始处的<a匹配,后跟任意数量的任何char(非贪婪) .*? 然后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"
    }
    

    你想要查找的模式将是链接锚点模式,例如(something):

    $regex_pattern = "/<a href="(.*)">(.*)</a>/";
    
    链接地址: http://www.djcxy.com/p/5065.html

    上一篇: Grabbing the href attribute of an A element

    下一篇: always "using namespace std"?