正则表达式获取站点名称所需的更正


correction required for regular expression to get site name

问题:提取http://www..com之间或http:// &.com .

解决方案:

<?php
$url1='http://www.examplehotel.com';
//$url2='http://test-hotel-1.com';
$pattern='@^http://([^/]+).com@i';
preg_match($pattern, $url1, $matches);
print_r($matches);
?>

当$url1匹配时,它应该返回字符串'examplehotel'
当$url2匹配时,它应该返回字符串'test-hotel-1'

$url2可以正常工作,但$url1为空....

在我的模式中,我想添加[http://][http://www.],我添加了(http://)+(www.)+,但匹配返回不期望:(.

我可以知道我错在哪里吗?

试试这个:

$pattern='@^http://(?:www'.)?([^'.]+).com@i';

或者在你的模式中,你只需要让www是可选的(可以出现在模式中,也可以不出现):

$pattern='@^http://(?:www'.)?([^/]+).com@i';

问题是,您正在匹配从两个斜杠到.com的所有内容。如果有一个www.,你也匹配它,在你的捕获组。

解决方案是在捕获组之前选择性地匹配www.,如下所示

^http://(?:www'.)?([^/]+)'.com
        ^^^^^^^^^^       ^^

(?:www'.)?这是一个非捕获组,即内容不存储在结果中。末尾的?使其成为可选的。

'.将匹配文字"."。.是regex中的一个特殊字符,意思是"任意字符"。

可以在Regexr上在线查看,当您将鼠标悬停在字符串上时,您将看到捕获组的内容。

关于你的尝试与[http://]等。当您使用方括号时,您正在创建一个字符类,这意味着从方括号内匹配一个字符。当您想对字符进行分组时,请使用捕获()或非捕获(?:)组。

preg_match_all('%http(?:s)?://(?:www'.)?(.*?)'.com%i', $url, $result, PREG_PATTERN_ORDER);
print_r($result[1])