如何使用PHP从URL获取域名?

时间:2016-01-01 20:58:29

标签: php mysql

我有2个表(url_feedclean_domains)。我正在尝试将url_feed中的所有数据复制到clean_domains,同时从domain列插入url

此外,在将行复制到status后,它会将queuedcomplete更改为url_feed clean_domains

这是2个表格的样子:

url_feed

id | url                                    | matches | networks                    | status
1  | http://whatever.com/example1.php       | 5       | Facebook::Twitter Inc       | queued
2  | http://www.example.com/other-stuff.php | 2       | MySpace::Facebook::Twitter  | queued
3  | http://www.test.com/random-text        | 12      | Instagram::Twitter          | queued

clean_domains

id | domain       | url                                     | matches | networks                    | status
1  | whatever.com | http://whatever.com/example1.php        | 5       | Facebook::Twitter Inc       | queued
2  | example.com  | http://www.example.com/other-stuff.php  | 2       | MySpace::Facebook::Twitter  | queued
3  | test.com     | http://www.test.com/random-text         | 12      | Instagram::Twitter          | queued

这是我的代码:

<?php
$con=mysqli_connect("localhost","redacted","redacted","redacted");

mysqli_query($con,"INSERT INTO clean_domains
(id,domain,url,matches,networks)
  SELECT
    id,
    SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(url, 'http://', ''), 'https://', ''), 'http://www.', ''), 'https://www.', ''), '/', 1),
    url,
    matches,
    networks
  FROM url_feed
  WHERE status = 'queued'");

mysqli_query($con,"UPDATE url_feed
SET    status = 'complete'
WHERE status = 'queued' AND
id IN (SELECT id
FROM   clean_domains)");

mysqli_close($con);
?>

我的代码适用于99%的域名,但我无法弄清楚如何使其完美运行。

这是3次似乎不能完美运作:

  1. 冒号 - http://example.com:88/testing - 这样的网址将其域名输出为example.com:88,而我希望它为example.com

  2. IP地址 - http://188.123.44.12/test.php - 对于IP,它似乎正确地将IP地址输入数据库。在示例中,它将188.123.44.12作为domain输入 - 但我不希望这样。我只想要域名,所以如果是IP,就不应该复制它。它应该在complete中标记为url_feed,然后转到下一行。

  3. 子域名 - http://subdomain.whatever.example.com/test.html - 当我想要domain subdomain.whatever.example.com时,我会将其example.com列输入subdomain.whatever.example.com列。

    < / LI>

    我能想到验证输入的域是否真的是域的唯一方法是对每个域运行一个whois查询。如果它没有作为有效的回复,它删除了第一个文本块。例如,它不会获得whatever.example.com的有效结果,因此它会尝试example.com然后尝试status,直到结果有效或跳过它并标记{{1 }列为complete

    关于我可以改变什么以使其正常工作的任何想法?

    以下是我现在所处的位置:

    $_url_string = 'https://testfewfew.dsd.google.co.uk/testing/whatever';
    preg_match("/[a-z0-9\-]{1,63}\.[a-z\.]{2,6}$/", parse_url($_url_string, PHP_URL_HOST), $_domain_tld);
    echo $_domain_tld[0];
    

1 个答案:

答案 0 :(得分:5)

只需使用内置的php函数parse_url

您可以像这样

过滤主机名中的子域名
$url = 'http://subdomain.whatever.example.com/test.html';

$data = parse_url($url);

$host = $data['host'];

$hostname = explode(".", $host);
$domain = $hostname[count($hostname)-2] . "." . $hostname[count($hostname)-1];

print $domain;

将输出

example.com

如果您的url有端口,parse_url会轻松处理,例如

$url = 'http://example.com:88/testing';

$data = parse_url($url);

print_r($data);

将输出

Array
(
    [scheme] => http
    [host] => example.com
    [port] => 88
    [path] => /testing
)

然后在下面检查主机名是否是有效的IP地址

$url = 'http://188.123.44.12/test.php';

$data = parse_url($url);

print_r($data);

$hostIsIpAddress = ip2long($data['host']) !== false;

var_dump($hostIsIpAddress);

分别输出bool(true)bool(false)