Facebook的URL匹配算法如何运作?

时间:2013-08-17 05:53:03

标签: javascript regex facebook

你知道如果你去facebook.com并输入一个URL到状态更新textarea它将自动被检测到,Facebook将显示该URL /链接数据的一些快照? Facebook甚至不关心您是否使用http://等协议输入网址。

我想要复制这种行为。现在我有这个正则表达式:

((?:https?:\/\/)?)((?:[a-zA-Z0-9\-]+\.)+(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2})(?:[a-z0-9\._\/~%\-\+&\#\?!=\(\)@]*)?(?:#?(?:[w]+)?)?)

我用它来匹配在textarea中输入的URL。但是,它有误报;它会匹配document.write(foo),它显然不是一个URL。

Facebook似乎没有这个问题。事实上,我可以在Facebook的textarea中键入“yahoo.com”,它会将其识别为URL。但如果我输入“example.com”,它就不会识别它。所以,这意味着Facebook必须做的不仅仅是正则表达式匹配。或者我错了吗?

总之,我想知道Facebook在做什么,我想知道如何复制它。任何想法,提示或解决方案都非常感谢。

感谢阅读。

3 个答案:

答案 0 :(得分:1)

匹配任何网址的最简单的正则表达式是

[a-z_\.\-0-9]+\.[a-z]+

如果存在,请对结果进行查找。如果结果失败,那么它不是一个网址。

如果网址没有http://前缀,则无法保存网址是否为网址。

正则表达式将匹配以下字符串中的 stackoverflow.com ;

  

我总是使用 stackoverflow.com 来找到我需要的答案。

如果你尝试"http://www." & regex.match.value,你应该得到一个有效的网址......或者不是......在你查找之前你不会知道。

答案 1 :(得分:0)

facebook正在使用contenteditable div来检测链接, 在你的结尾,我建议你听每个键盘,因为它有多种用途,例如在按@后你也会看到朋友列表

答案 2 :(得分:0)

也许在发布猜测的网址之前,它会进行ajax ping或其他什么来确保候选网址在呈现之前确实存在?