【问题标题】:Regex to find all URL and titles正则表达式查找所有 URL 和标题
【发布时间】:2011-12-14 06:48:08
【问题描述】:

我想从一段文本中提取所有的网址和标题。

Les <a href="http://test.com/blop" class="c_link-blue">résultats du sondage</a> sur les remakes et suites souhaités sont <a href="http://test.com" class="c_link-blue">dans le blog</a>.

由于以下正则表达式,我能够获得所有 href,但我不知道如何获得另外,&lt;a&gt;&lt;/a&gt; 标签之间的标题?

preg_match_all('/<a.*href="?([^" ]*)" /iU', $v['message'], $urls);

最好的办法是得到一个这样的关联数组

[0] => Array
(
   [title] => XXX
   [link] => http://test.com/blop
)
[1] => Array
(
   [title] => XXX
   [link] => http://test.com
)

感谢您的帮助

【问题讨论】:

标签: php regex url


【解决方案1】:

如果你仍然坚持使用正则表达式来解决这个问题,你也许可以用这个正则表达式解析一些:

<a.*?href="(.*?)".*?>(.*?)</a>

请注意,它不像您那样使用 U 修饰符。

更新:要让它接受单引号和双引号,您可以改用以下模式:

<a.*?href=(?:"(.*?)"|'(.*?)').*?>(.*?)</a>

【讨论】:

  • preg_match_all('#&lt;a.*?href="(.*?)".*?&gt;(.*?)&lt;/a&gt;#i', $v['message'], $matches);
  • 当href容器的双引号是单引号时会失败
  • @MohanSinfh 更新了它,支持两者。虽然我仍然建议你应该使用真正的 DOM 解析器而不是正则表达式
【解决方案2】:

正如在 cmets 中提到的,不使用正则表达式,而是使用 DOM 解析器。
例如

<?php
$doc = new DOMDocument;
$doc->loadhtml( getExampleData() );

$xpath = new DOMXPath($doc);
foreach( $xpath->query('/html/body/p[@id="abc"]//a') as $node ) {
    echo $node->getAttribute('href'), ' - ' , $node->textContent, "\n";
}

function getExampleData() {
    return '<html><head><title>...</title></head><body>
    <p>
        not <a href="wrong">this one</a> but ....
    </p>
    <p id="abc">
        Les <a href="http://test.com/blop" class="c_link-blue">résultats du sondage</a> sur les remakes et suites souhaités sont <a href="http://test.com" class="c_link-blue">dans le blog</a>.
    </p>
    </body></html>';
}

http://docs.php.net/DOMDocumenthttp://docs.php.net/DOMXPath

【讨论】:

    【解决方案3】:

    您不应该为此使用 RegEx。您应该使用 XML/DOM 解析器。我使用DOMDocument 快速完成了这个。

    $links = array();
    $dom = new DOMDocument;
    @$dom->loadHTML('Les <a href="http://test.com/blop" class="c_link-blue">résultats du sondage</a> sur les remakes et suites souhaités sont <a href="http://test.com" class="c_link-blue">dans le blog</a>.');
    $xPath = new DOMXPath($dom);
    $a = $xPath->query('//a');
    for($i=0; $i<$a->length; $i++){
        $e = $a->item($i);
        $links[] = array(
            'title' => $e->nodeValue,
            'link' => $e->getAttribute('href')
        );
    }
    print_r($links);
    

    演示:http://codepad.org/2LEn2CAJ

    【讨论】:

      【解决方案4】:
      preg_match_all("/<a[^>]*href=\"([^\"]*)[^>]*>([^<]*)</a>/", $v['message'], $urls, PREG_SET_ORDER)
      

      应该努力给你你想要的。它不是关联数组,但它应该是您想要的格式的嵌套数组。

      【讨论】:

        【解决方案5】:

        对于建议使用 DOM 的人来说,使用 DOM 可能会更好。但当然你不会使用 FULL DOM 解析器来解析几个 urls/titles!

        只需使用正则表达式:

        /<a.*href="([^" ]*)".*>(.*)<\/a>/iU
        

        【讨论】:

        • 当然我会使用 full DOM 解析器来解析几个 urls/titles。这就是 DOM 解析器的作用,解析 DOM。
        猜你喜欢
        • 2016-06-27
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 2010-09-26
        • 2016-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多