preg_match_all 不匹配所有主机名
preg_match_all doesn't match all hostnames
好的,我正在尝试获取主机名,我正在使用 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)
请问我应该更改什么才能获得所有匹配项?
它实际上 return 对我来说是一个空数组,因为您的模式中有行首 (^) 和行尾 ($)。如果删除它,您将获得更多结果。但仍然不是 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
)
试试这个:
preg_match_all("/[a-z]+[:.].*?(?=\s|$)/", 'google.com some text example.com', $matches);
在此处查看结果:http://ideone.com/sBvrSl
您可以应用的一个廉价技巧是简单地用词边界断言替换锚点:
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]);
好的,我正在尝试获取主机名,我正在使用 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)
请问我应该更改什么才能获得所有匹配项?
它实际上 return 对我来说是一个空数组,因为您的模式中有行首 (^) 和行尾 ($)。如果删除它,您将获得更多结果。但仍然不是 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
)
试试这个:
preg_match_all("/[a-z]+[:.].*?(?=\s|$)/", 'google.com some text example.com', $matches);
在此处查看结果:http://ideone.com/sBvrSl
您可以应用的一个廉价技巧是简单地用词边界断言替换锚点:
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]);