我正在尝试获取字符串中的所有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);
答案 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.com和http://www.abcd.gov.edu.ua.sub.sub.domain.com
答案 2 :(得分:0)
作为正则表达式,我会尝试以下内容:
/<a([^>]+href=\"http:\/\/([^\"]+?)\"/
如果(x)html href包含在双引号之间,这将获取以href“argument”给出的所有内容。为了将其用作另一个URL的一部分,您希望对字符进行编码吗?和&amp;避免将它们解释为您网址的一部分