问题:提取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])