正则表达式模式仅匹配没有www的链接

时间:2015-04-02 18:28:45

标签: php regex expression html-parsing

我正在尝试仅搜索没有www的{​​{1}},或http://google.com等的链接。然后我想将https://facebook.com添加到同一链接,以便它成为www,或http://www.google.com

但是,我的模式存在问题(我以前使用或不使用www获取所有链接的模式)。

https://www.facebook.com

2 个答案:

答案 0 :(得分:2)

我会考虑使用 DOM XPath 来为您处理此问题。

$doc = new DOMDocument;
@$doc->loadHTML($html);

$xpath = new DOMXPath($doc);
$links = $xpath->query('//a[not(contains(@href, "www."))]/@href');

foreach ($links as $link) {
   // process yours urls by $link->nodeValue
   ...
   ...
 }

然后,您可以在处理网址时使用parse_url()进行替换。

答案 1 :(得分:0)

以下是<a\\s[^>]*href=([\"']?)(?>https?|ftps?):\/\/(?![^'\">]*www[^\"]+?\\1)([^'\">]+?)\\1[^>]*>(.*?)<\\/a>正则表达式的示例代码,仅匹配其中没有www的href属性中的那些网址。

Sample code

$re = "/<a\\s[^>]*href=([\"']?)(?>https?|ftps?):\/\/(?![^'\">]*www[^\"]+?\\1)([^'\">]+?)\\1[^>]*>(.*?)<\\/a>/"; 
$str = "<a href=\"http://google.com\">google</a> bla bla bla <a href=\"https://www.google.com\">google</a> bla bla bla <a href=\"http://facebook.com\">facebook</a>\n"; 
print ($str . "\n");
$str = preg_replace_callback(
    $re,
    function ($matches) {
        return str_replace($matches[2], "www." . $matches[2], $matches[0]);
  },
  $str
);
print ($str);

输出:

<a href="http://www.google.com">google</a> bla bla bla <a href="https://www.google.com">google</a> bla bla bla <a href="http://www.facebook.com">facebook</a>