鉴于以下 Facebook 个人资料和页面 URL,我的目的是将个人资料 ID 或用户名提取到第一个匹配位置。
http://www.facebook.com/profile.php?id=123456789
http://www.facebook.com/someusername
www.facebook.com/pages/Regular-Expressions/207279373093
到目前为止我的正则表达式看起来像这样:
(?:http:\/\/)?(?:www.)?facebook.com\/(?:(?:\w)*#!\/)?(?:pages\/)?(?:[?\w\-]*\/)?(?:profile.php\?id=(\d.*))?([\w\-]*)?
这会产生以下结果:
结果1:
结果2:
结果3:
理想的结果是这样的:
结果1:
结果2:
结果3:
也就是说,我希望个人资料标识符始终返回到第一个位置。
www.facebook.com/ 也很理想,而 facebook.com/ 也不匹配。
我推荐Rad Software正则表达式设计器。
这个在线工具也很棒https://regex101.com/(尽管大多数人更喜欢http://regexr.com/)
(?:(?:http|https):\/\/)?(?:www.)?facebook.com\/(?:(?:\w)*#!\/)?(?:pages\/)?(?:[?\w\-]*\/)?(?:profile.php\?id=(?=\d.*))?([\w\-]*)?
我不久前提出了一个要点,它与给定的示例配合得很好:
# Matches patterns such as:
# http://www.facebook.com/my_page_id => my_page_id
# http://www.facebook.com/#!/my_page_id => my_page_id
# http://www.facebook.com/pages/Paris-France/Vanity-Url/123456?v=app_555 => 45678
# http://www.facebook.com/pages/Vanity-Url/45678 => 45678
# http://www.facebook.com/#!/page_with_1_number => page_with_1_number
# http://www.facebook.com/bounce_page#!/pages/Vanity-Url/45678 => 45678
# http://www.facebook.com/bounce_page#!/my_page_id?v=app_166292090072334 => my_page_id
/(?:http:\/\/)?(?:www\.)?facebook\.com\/(?:(?:\w)*#!\/)?(?:pages\/)?(?:[\w\-]*\/)*([\w\-]*)/
只有这个正则表达式适用于所有 FB URL:
/(?:https?:\/\/)?(?:www\.)?(?:facebook|fb|m\.facebook)\.(?:com|me)\/(?:(?:\w)*#!\/)?(?:pages\/)?(?:[\w\-]*\/)*([\w\-\.]+)(?:\/)?/i
我已经尝试了上面的每一个答案,但每个答案都至少由于一个原因而不起作用。这很可能对OP没有帮助,但如果像我这样的人在网络搜索中找到这个,我相信这是正确的答案:
^(?:.*)\/(?:pages\/[A-Za-z0-9-]+\/)?(?:profile\.php\?id=)?([A-Za-z0-9.]+)
基本上支持我能想到的所有内容,除了验证域是否包含 facebook.com 之外。如果您需要检查 URL 是否有效,则应在正则表达式之外完成此操作,以确保页面或个人资料确实存在。为什么要检查两次,特别是当其中一项检查不完整时?
最完整的 Facebook 个人资料网址模式:
/(?:https?:\/\/)?(?:www\.)?facebook\.com\/.(?:(?:\w)*#!\/)?(?:pages\/)?(?:[\w\-]*\/)*([\w\-\.]*)/
它检测所有情况+一个重要的区别。其他正则表达式模式将 http://www.facebook.com/ 识别为有效的 Facebook 个人资料 URL,但它不是有效的个人资料 URL。它只是原始 Facebook URL,而不是用户或页面地址。但此正则表达式可以区分普通 url 与个人资料和页面 url,并且只接受有效的 url。
匹配 facebook.com、m.facebook.com、mbasic.facebook.com 和 fb.me(短链接)
/(?:https?:\/\/)?(?:www\.)?(mbasic.facebook|m\.facebook|facebook|fb)\.(com|me)\/(?:(?:\w\.)*#!\/)?(?:pages\/)?(?:[\w\-\.]*\/)*([\w\-\.]*)/ig
正则表达式将正确识别带有 .以 www.facebook.com/my.name 等名称命名,并且还会排除 www.facebook.com/ 或 home.php,因为它不是有效的 Facebook 页面。
https://regex101.com/r/koN8C2/2
(?:(?:http|https):\/\/)?(?:www.|m.)?facebook.com\/(?!home.php)(?:(?:\w)*#!\/)?(?:pages\/)?(?:[?\w\-]*\/)?(?:profile.php\?id=(?=\d.*))?([\w\.-]+)
如果您发现任何不匹配的内容,请告诉我。
我不知道为什么我对此投入了大量资金,尽管这并不是我真正需要的东西或缺少解决方案 但我添加了一个结合所有规则的超精细解决方案+不允许连续的句点或少于 5 个字符的配置文件
在这里查看我的正则表达式:https://regex101.com/r/6OQYWr/2
(您可以查看单元测试部分以查看它处理的所有案例)