使用正则表达式获取除基本href之外的所有超链接

时间:2012-04-03 12:29:41

标签: php regex url preg-replace

我正在尝试获取字符串中的所有html链接并使用preg_replace将其替换为另一个链接(用于链接跟踪等)

它适用于http://www.facebook.com之类的链接,但不适用于字符串中没有'www'的链接。 所以第一个网址没问题,但后者不起作用 - 任何人都可以建议我如何改变我的表达方式以允许这样的BOTH链接起作用。

http://www.twitter.com
http://twitter.com/myusername

$message = preg_replace("/<a([^>]+)href=\"http\:\/\/([a-zA-Z0-9\-]+\.[a-zA-Z0-9]+\.[a-zA-Z]{2,3}(\/*)?)/", "<a$1href=\"http://www.site.com/system/link_tracker.php?URL=$2&ID={$ID}\"", $message);

3 个答案:

答案 0 :(得分:1)

  

HTTP://([A-ZA-Z0-9-] + [A-ZA-Z0-9] + [A-ZA-Z] {2,3}(/ *)

这绝不是URL正则表达式。它可能适用于两到三种情况,但你忽略了:

的存在

用户尤其不喜欢后者,因为当他们深入链接某个网站时,使用正则表达式会使此链接无效。使用常用方法,例如DOMDocument.replaceChild()来更改HTML文档中的链接(我假设您使用,因为您在<a>标记中捕获了URL)。

正如this answer中所述,可以通过以下方式完成,未经测试:

$dom = new DOMDocument();  
$html = @$dom->load(...); // Load your html
$links = $dom->getElementsByTagName('a'); 

foreach ($links as $link)
{
    // Store original node
    $origLink = $link;

    // Find original href
    $href = $link->getAttribute('href');

    // Replace link
    $href = "http://www.site.com/system/link_tracker.php?URL=" . urlencode($href) . "&ID={$ID}";

    // Replace href
    $link->setAttribute('href', $href);

    // Replace child (don't know if this is required because you already alter $link)
    $dom->replaceChild($link, $origLink);

}   

答案 1 :(得分:0)

$message = preg_replace("/<a([^>]+)href=\"http\:\/\/((?:[a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,3}(\/*)?)/", "<a$1href=\"http://www.site.com/system/link_tracker.php?URL=$2&ID={$ID}\"", $message);

可以使用http://twitter.comhttp://www.abcd.gov.edu.ua.sub.sub.domain.com

答案 2 :(得分:0)

作为正则表达式,我会尝试以下内容:

/<a([^>]+href=\"http:\/\/([^\"]+?)\"/

如果(x)html href包含在双引号之间,这将获取以href“argument”给出的所有内容。为了将其用作另一个URL的一部分,您希望对字符进行编码吗?和&amp;避免将它们解释为您网址的一部分