【问题标题】:Extracting TLD using PHP regex使用 PHP 正则表达式提取 TLD
【发布时间】:2012-07-12 02:13:39
【问题描述】:

我有一个域名数组,格式如下:

www.example.com
www.example.co.uk

我想从中提取顶级 TLD,这将导致(分别):

com
uk

要在 PHP 中执行此操作,我使用的是正则表达式:

preg_match("`(?<=\.)\w+$`", $cc, $tld_array);

这意味着匹配域中最后一个 . 直到字符串的末尾。我希望这能给我

com
uk

如上,但只收到

NULL
uk

谁能明白为什么二级 TLD 有效,而一级 TLD 却无效?

RegExr 建议他们也应该这样做:http://regexr.com?31gsg

【问题讨论】:

  • 您是否从 $tld_array[0] 检索字符串

标签: php regex text-parsing


【解决方案1】:

您不必对所有内容都使用正则表达式 :-) 一个不错的选择:

echo substr($domain, strrpos($domain, ".")+1);

【讨论】:

  • 肯定只找到第一个 .,因此例如对于 www.example.co.uk 它将返回 example.co.uk?
  • 不,如果我使用 strpos 而不是 strrpos。后一个函数从头到尾搜索,所以我的答案有效。
  • 整洁!谢谢。我会将您的答案标记为正确,但从技术上讲,Marc B 的答案是对我的问题最直接的答案,因此必须交给他。
  • 无论你的船漂浮什么 :-)
  • 谢谢伙计——我确实使用 strpos 而不是 strrpost 来获取 sld 和 tld ......我看不出有任何问题 - 认为我可能会遇到任何类型的域?
【解决方案2】:

如果你想在没有正则表达式的情况下执行此操作,我建议在http://php.net/manual/en/function.parse-url.php 使用 php 的 parse_url 函数

示例(您也可以在 php.net 上找到此示例):

$url = 'http://username:password@hostname:9090/path?arg=value#anchor';
var_dump(parse_url($url, PHP_URL_HOST));

【讨论】:

    【解决方案3】:

    如果您只需要从“www.example.co.uk”中提取“uk”,使用字符串函数的解决方案非常好。但是,这不是提取真实 TLD 的正确方法,例如,“www.example.co.uk”的 TLD 是“co.uk”,而不是“uk”。

    您需要使用Public Suffix List 的软件包,只有这样您才能正确提取具有二级、三级TLD(co.uk、a.bg、b.bg 等)的域。我推荐使用TLD Extract

    这里的代码示例:

    $extract = new LayerShifter\TLDExtract\Extract();
    
    $result = $extract->parse('www.example.co.uk');
    $result->getSuffix(); // will return (string) 'co.uk'
    

    【讨论】:

      【解决方案4】:

      在这里发帖,因为评论对此不起作用:

      php > $cc = 'www.example.com';
      php > preg_match("`(?<=\.)\w+$`", $cc, $tld_array);
      php > print_r($tld_array);
      Array
      (
          [0] => com
      )
      

      如果这对您不起作用,请确保您的 example.com 字符串中没有隐藏一些不可打印的字符。

      【讨论】:

      • 我再次运行我的查询并进行一些调试以查看正在发生的事情。
      • 你是对的,输入中有意外的字符。
      • 这不适用于具有两个域名的 com.de 或 tld。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2013-01-05
      • 2021-10-13
      相关资源
      最近更新 更多