preg_match返回奇怪的结果

时间:2009-11-20 23:09:58

标签: php regex preg-match

我正在搜索字符串中的网址...而我的preg_match正在为我的演示字符串提供不正确的匹配数量。

字符串:

  

嘿那里,请访问我的网站www.example.com

功能:

preg_match("#(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t<]*)#ise", $string, $links);
echo count($links);

结果为3。

任何人都可以帮我解决这个问题吗?我是REGEX的新手。

3 个答案:

答案 0 :(得分:5)

$linksarray of sub matches

  

如果提供了 matches ,则会填充搜索结果。 $matches[0] 将包含与完整模式匹配的文本, $matches[1] 将具有与第一个捕获的带括号的子模式匹配的文本,依此类推。

两组的匹配加上完整正则表达式的匹配会产生三个数组项。

也许您更希望使用preg_match_all进行所有比赛。

答案 1 :(得分:1)

如果您使用preg_match_pattern,(正如Gumbo建议的那样),请注意,如果您对此字符串运行正则表达式,它将匹配您的锚属性“href”的值以及在这种情况下发生的链接文本得到一个网址。这使得两场比赛。

在结果集上运行array_unique是明智的:)

答案 2 :(得分:0)

除了有关如何使用preg_match的建议外,我相信您正在使用的正则表达式存在严重错误。你可能想尝试这样的事情:

 preg_match("_([a-zA-Z]+://)?([0-9a-zA-Z$-\_.+!*'(),]+\.)?([0-9a-zA-Z]+)+\.([a-zA-Z]+)_", $string, $links);

这应该处理大多数情况(尽管如果在顶级域之后有查询字符串,它将无效)。将来,在编写正则表达式时,我建议以下网站提供帮助:http://www.regular-expressions.info/,尤其是http://regexpal.com/,以便在编写时对其进行测试。