用于匹配URL的最后两部分的正则表达式

时间:2013-01-14 06:05:45

标签: regex pattern-matching

我想找出最好的regex,只是简单地匹配网址中的最后两个字符串。

例如 www.stackoverflow.com 我只想匹配 stackoverflow.com

我遇到的问题是某些字符串可能有很多句点,例如

a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com 

也应仅返回 yimg.com

我正在使用的URL集没有任何路径信息,因此我们可以假设字符串的最后一部分始终是.org.com或那种性质的东西。

  

当针对www.stackoverflow.com运行时,常规表达将返回stackoverflow.com,并且当针对a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com运行时将返回yimg.com   在上述条件下?

4 个答案:

答案 0 :(得分:3)

您不必使用正则表达式,而是可以使用简单的explode函数。

因此,您希望在各个时段拆分您的网址,例如

$url = "a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com";
$url_split = explode(".",$url);

然后你需要得到最后两个元素,这样你就可以从创建的数组中回显它们。

//this will return the second to last element, yimg
echo $url_split[count($url_split)-2];
//this will echo the period
echo ".";
//this will return the last element, com
echo $url_split[count($url_split)-1];

所以最后你会得到yimg.com作为最终输出。

希望这有帮助。

答案 1 :(得分:1)

如果你需要一个可以在多种语言中工作的Perl正则表达式兼容方式的解决方案,你可以使用类似的东西 - 例如在PHP中

$url = "a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com";

preg_match('|[a-zA-Z-0-9]+\.[a-zA-Z]{2,3}$|', $url, $m);
print($m[0]);

此正则表达式保证您获取url +域名的最后一部分。例如,使用a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com生成

yimg.com

作为输出,并且使用www.stackoverflow.com(有或没有前三个w)它会给你

stackoverflow.com
结果

答案 2 :(得分:1)

我不知道你到目前为止做了什么,但我可以提供以下解决方案:

/.*?([\w]+\.[\w]+)$/

这里有一些技巧:

  1. 使用$匹配直到字符串结尾。通过这种方式,您可以确保您的正则表达式引擎从一开始就无法捕捉到匹配。

  2. 在(...)内使用分组。实际上它意味着以下内容:匹配包含至少一个字母的单词然后应该有一个点(反斜杠,因为点在正则表达式中具有特殊含义,我们希望它'原样'然后再次出现一系列至少有一个字母的字母字母)。

  3. 在模式的开头使用不情愿的搜索,因为否则它将以贪婪的方式匹配所有内容,例如,如果您的文本是:

    abc.def.gh

  4. 贪婪的比赛会给你的小组提供f.gh,而不是你想要的。

    我认为你的主人只能有字母(\ w匹配这个单词,也许在你的例子中你需要更复杂的东西)。

    我在这里发布一个工作的groovy示例,你没有指定你使用的语言,但引擎应该是相似的。

    def  s = "abc.def.gh"
    def m = s =~/.*?([\w]+\.[\w]+)$/
    println m[0][1] // outputs the first (and the only you have) group in groovy
    

    希望这有帮助

答案 3 :(得分:0)

较短的版本

/(\.[^\.]+){2}$/
相关问题