我正在搜索字符串中的网址...而我的preg_match正在为我的演示字符串提供不正确的匹配数量。
字符串:
嘿那里,请访问我的网站www.example.com
功能:
preg_match("#(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t<]*)#ise", $string, $links);
echo count($links);
结果为3。
任何人都可以帮我解决这个问题吗?我是REGEX的新手。
答案 0 :(得分:5)
$links
是array 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/,以便在编写时对其进行测试。