如果在某个地方回答了此问题,但是像所有内容一样,Google会提供十亿个结果,导致错误答案。REGEX在复杂网址中查找包含子网域的网址
我有一个URL /电子邮件解析器链接我的网站(PHP)上的网址和电子邮件地址。一切都很好,直到我获得了一些国际客户提供复杂的域名(.com.au等)
这是我目前拥有的功能...
FUNCTION linkScan($string1) {
$pattern1 = "/(?<![\/\d\w])(http:\/\/)?([\w\d\-]+)((\.([\w\d\-])+){2,})([\/\?\w\d\.\-_&=+%]*)?/i";
$pattern2 = "/([\w\d\.\-\_]+)@([\w\d\.\_\-]+)/mi";
$replace1 = "<a href=\"http://$2$3$6\" target=\"_blank\">$0</a>";
$replace2 = "<a href=\"mailto:$0\">$0</a>";
$string2 = PREG_REPLACE($pattern1,$replace1,$string1);
$string3 = PREG_REPLACE($pattern2,$replace2,$string2);
$string3 = convertSmartQuotes($string3);
RETURN $string3;
}
,直到它找到一个电子邮件地址,它工作正常[email protected]
因为它首先查找URL,它找到somewhere.com.au部分并使其成为链接,然后当电子邮件扫描发生时,由于现在嵌入了HTML标记,它被忽略在里面。
如果强制使用URL中的子域(无论是www还是其他),并且不在乎它前面是否存在http://,那么我想要做什么。但是由于正则表达式似乎只关心是否有3个部分(子域名,域名,.com),因此正则表达式错误地认为.com.au中的.com实际上是域名部分。
应该找...
subdomain.domain.com
subdomain.domain.com.au
它不应该找...
域.com
domain.com.au(目前发现)
如果有人能够用正则表达式来帮助我们,那太棒了。 谢谢
不是一个真正的解决方案,而是让您的正则表达式更易于阅读:您可以使用除/以外的分隔符作为正则表达式,然后您不必在正则表达式中转义斜线。 –
你的正则表达式很简单,它应该匹配'luser @ example.com.au'就好 - 你确定它没有? – tripleee