2011-08-16 75 views
0

问题:http://www..com OR http:// & .com之间提取任何东西。校正获得网站名称

解决方案:

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

当$ URL1匹配,它应该返回字符串 'examplehotel'
当$ URL2匹配,它应该返回字符串 '测试酒店-1'

它正常工作为$ URL2但为空URL1 $ ....

在我的模式我想补充[http://][http://www.]我加(http://)+(www.)+但是匹配的回报也无法教人口会d :(。

我可以知道我要去哪里吗?

回答

1

试试这个:

$pattern='@^http://(?:www\.)?([^\.]+)[email protected]'; 

或在你的模式,你只需要做出www可选的(可能会或可能不会出现在模式):

$pattern='@^http://(?:www\.)?([^/]+)[email protected]'; 
1

的问题是,你是匹配从两个斜线到.com的所有内容。如果有www.,您也可以在您的捕捉组中匹配。

该解决方案是任选的捕获组之前以匹配www.,像这样

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

(?:www\.)?这是一种非捕获组,即内容没有存储在结果中。最后的?使其成为可选项。

\.将匹配文字“。”。 .是正则表达式中的一个特殊字符,意思是“任何字符”。

在此处查看online on Regexr,将鼠标悬停在字符串上时,您将看到捕获组的内容。

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

+0

+1这明显帮助我了解我错在哪里。感谢Stema – user269867

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