道歉,如果之前已经回答了这个问题,但就像所有事情一样,google会给出十亿分的结果,这些都会导致错误的答案。
我有一个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;
}
在找到电子邮件地址someone@somewhere.com.au
之前一切正常因为它首先查找URL,它找到somewhere.com.au部分并将其作为链接,然后当电子邮件扫描发生时,由于现在嵌入了HTML标记,它将被忽略。
如果强制在URL中使用子域名(无论是www还是其他),我想做什么,而不关心前面是否有http://。但是因为正则表达式似乎只关心是否存在3个部分(子域,域,.com),所以正则表达式错误地认为.com.au中的.com实际上是域部分。
应该找到......
subdomain.domain.com
subdomain.domain.com.au
它不应该找到......
domain.com
domain.com.au(目前正在寻找)
如果有人可以帮助我们使用正则表达式,那就太棒了。 感谢
答案 0 :(得分:1)
如果所有顶级域名及其结构都需要列表。 Mozilla项目有这样一个列表;它是几百行,所以把它加入正则表达式可能很麻烦,虽然肯定不是不可能的。 https://wiki.mozilla.org/TLD_List 更新取代http://publicsuffix.org/
无论如何,很可能你做错了。你想要完成什么?
答案 1 :(得分:-2)
Regex有一个很好的表达式列表,还包括一个很好的测试人员,以确保你的表达式有效。