preg_match表达式如何忽略一个字符

时间:2011-01-26 13:02:32

标签: php regex preg-match

我绝对是一个新手,并没有冒险到这个级别,但需要能够将一个域剥离到只有搜索功能的主机名。我查看并发现下面的内容非常有用,除非域名中有任何-。因此,http://www.example.comexample.com一样下调到www.example.com,但www.exa-mple.com变为example.com

$pattern = '/\w+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i';
$url = $myurl;
if (preg_match($pattern, $url, $matches) === 1) {

    $mydom = $matches[0];
}

表达式中必须更改哪些内容才能接受域名中的-

3 个答案:

答案 0 :(得分:5)

你最好使用parse_url功能:

parse_url($url)

如果网址没有以http://开头,则只提前{{1}}。

答案 1 :(得分:0)

您的正则表达式目前允许使用字符_并禁止使用字符-,这意味着它接受无效的网址。您可以使用以下组进行更正:

$pattern = '/[a-z0-9-]+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i';

请注意,这仍然存在问题。首先,不允许域名以连字符开头或结尾。其次,您目前允许使用TLD中的任何字符,而它们只包含字母。

最好的解决方案是使用正确的URL解析库,而不是自己尝试这样做。

答案 2 :(得分:0)

$sites = array('mysite.com',
'www.mysite.com',
'http://www.mysite.com',
'www.my-site.com',
'sub.folder.2.example.com',
'http://www.mysite.com/argh/index.php');

$reg = '%^(?:http://)?(?:[^.]*\.)*([a-zA-Z0-9_-]+\.[a-zA-Z0-9]+)%m';

foreach($sites as $site)
{

    if(preg_match($reg,$site,$matches))
    {
        echo $matches[1],PHP_EOL;
    }
}

输出:

mysite.com
mysite.com
mysite.com
my-site.com
examle.com
mysite.com