regex从url创建链接并删除www


regex to create link from url and strip www

我有一个PHP函数,它接受一个传递的url并创建一个干净的链接。它将完整的链接放在锚点标签中,并只显示url中的"www.domain.com"。它工作得很好,但我想修改一下,这样它也去掉了"www."部分。

<?php
    // pass a url like: http://www.yelp.com/biz/my-business-name
    // should return: <a href="http://www.yelp.com/biz/my-business-name">yelp.com</a>
    function formatURL($url, $target=FALSE) {
        if ($target) { $anchor_tag = "<a href='"''0'" target='"$target'">''4</a>"; }
        else { $anchor_tag = "<a href='"''0'">''4</a>"; }
        $return_link = preg_replace("`(http|ftp)+(s)?:(//)(('w|'.|'-|_)+)(/)?('S+)?`i", $anchor_tag, $url);
        return $return_link;
    }
?>

我的正则表达式技能不是很强,所以非常感谢任何帮助。

看看parse_url:http://us2.php.net/manual/en/function.parse-url.php

这将大大简化您的逻辑,可以使替换www成为一个简单的字符串替换。

$link = 'http://www.yelp.com/biz/my-business-name';
$hostname = parse_url($link, PHP_URL_HOST));
if(strpos($hostname, 'www.') === 0)
{
   $hostname = substr($hostname, 4);
}

为了说明评论中的问题,我修改了原来的答案。下面文章中的preg_replace也会起作用,而且更简洁,我将把它留在这里,以展示一个替代解决方案,如果您愿意,它不需要调用regex引擎。

这将获得域名减去www:

$url = preg_replace('/^www./', '', parse_url($url, PHP_URL_HOST));

正则表达式中的^表示仅从字符串的开头删除www

工作示例:http://codepad.org/FTNikw8g