繁体   English   中英

preg_match表达式如何忽略字符

[英]preg_match expression how to ignore a character

我绝对是新手,还没有冒险到这个级别,但是需要能够将域名缩减为仅用于搜索功能的主机名。 我看了一下,发现这低于相当多的作品,除非域名有什么-它。 因此, http://www.example.com www.exa-mple.com会像www.example.com一样简化为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];
}

表达式中必须更改什么才能使其接受域名中的-

您最好使用parse_url函数:

parse_url($url)

如果网址不是以http://开头,则只需加上http://

您的正则表达式当前允许使用字符_并不允许使用字符- ,这意味着它接受无效的URL。 您可以通过以下小组更正此问题:

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

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

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

$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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM