preg_match_all与所有主机名都不匹配

时间:2015-03-05 05:39:33

标签: php preg-match-all

好的,我正在尝试获取主机名,而我正在使用this regex

preg_match_all("/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/", 'google.com some text example.com', $matches);
print_r($matches[0]);

匹配应该是:

google.com
example.com

但是,输出只是第一个匹配(google.com)

我应该改变什么来获得所有比赛?

3 个答案:

答案 0 :(得分:1)

你可以应用的一个便宜的技巧就是用字边界断言简单地替换你的锚点:

preg_match_all("/\b(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])\b/", 'google.com some text example.com', $matches);
//               ^^                                                                                                         ^^

那会产生:

Array(
  [0] => google.com
  [1] => some
  [2] => text
  [3] => example.com
)

在没有至少一个句号的情况下过滤单词:

preg_match_all("/\b(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)+([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])\b/", 'google.com some text example.com', $matches);
//                                                                       ^
print_r($matches[0]);

答案 1 :(得分:0)

它实际上为我返回一个空数组,因为你的模式中有行(^)和行尾($)的开头。如果删除它,您将获得更多结果。但仍然没有google.com和exaple.com,因为你的RegExp是这样编写的,1个字母就足够了。那就是我得到的

Array
(
    [0] => google.c
    [1] => o
    [2] => m
    [3] => s
    [4] => o
    [5] => m
    [6] => e
    [7] => t
    [8] => e
    [9] => x
    [10] => t
    [11] => example.c
    [12] => o
    [13] => m
)

答案 2 :(得分:0)

试试这个:

preg_match_all("/[a-z]+[:.].*?(?=\s|$)/", 'google.com some text example.com', $matches);

在此处查看结果:http://ideone.com/sBvrSl