我有以下正则表达式,ALMOST正常工作......
(?:^https?:\/\/)(?:www|[a-z]+)\.([^.]+)
我需要将结果作为唯一的结果,或者在Array中的相同位置。
例如,这个http://m.facebook.com/
匹配完美,只有一组。
但是,如果我将其更改为http://facebook.com/
,那么我会得到com/
来代替Facebook应该在哪里。所以我需要(?:www|[a-z]+)
作为可选检查。
编辑:
我期望只是匹配facebook
,如果任何字符串如下:
显然 https 对应物。
这是我现在的正则表达式
(?:^https?:\/\/)(?:www)?\.?([^.]+)
这很接近,但当我尝试“http://m.facebook.com
时,它与 m 相匹配答案 0 :(得分:2)
所以我需要(?:www | [a-z] +)作为可选检查。
模式结尾处的?
通常用于"可选"位 - 它意味着"匹配零或一个"那个东西,所以你的子模式将是这样的:
(?:www|[a-z]+)?
如果您只是想尝试获得二级域名,我就不会打扰正则表达式,因为您会不断调整它来处理您遇到的特殊情况。只需按点分割并取倒数第二个值:
$domain = array_reverse(explode('.', parse_url($str)['host']))[1];
或者:
$domain = array_reverse(explode('.', parse_url($str, PHP_URL_HOST)))[1];
答案 1 :(得分:1)
也许您可以使用m.
使第一个(?:\w+\.)?
部分可选。
您可以使用\K
重置报告的匹配的起始点,而不是捕获组。
然后匹配一个或多个单词字符\w+
并使用正向前瞻来断言后面的内容是一个点(?=\.)
例如:
^https?://(?:www)?(?:\w+\.)?\K\w+(?=\.)
修改:或者您可以使用替换匹配m.
或www.
: