正则表达式 - 匹配字符但不包含在结果中

时间:2018-04-13 15:11:15

标签: php regex

我有以下正则表达式,ALMOST正常工作......

(?:^https?:\/\/)(?:www|[a-z]+)\.([^.]+)

我需要将结果作为唯一的结果,或者在Array中的相同位置。

例如,这个http://m.facebook.com/匹配完美,只有一组。

但是,如果我将其更改为http://facebook.com/,那么我会得到com/来代替Facebook应该在哪里。所以我需要(?:www|[a-z]+)作为可选检查。

编辑:

我期望只是匹配facebook,如果任何字符串如下:

  

http://www.facebook.com

     

http://facebook.com

     

http://m.facebook.com

显然 https 对应物。

这是我现在的正则表达式

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

这很接近,但当我尝试“http://m.facebook.com

时,它与 m 相匹配

https://regex101.com/r/GDapY5/1

2 个答案:

答案 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.

^https?://(?:m\.|www\.)?\K\w+(?=\.)

Demo Php