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

use*_*848 3 php mysql

我有2个表(url_feedclean_domains).我正在尝试将所有数据复制url_feedclean_domains同一时间并domainurl列中插入.

此外,它会在将行复制到之后将statusfrom 更改queuedcompletein .url_feedclean_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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

<?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);
?>
Run Code Online (Sandbox Code Playgroud)

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

这是3次似乎无法完美运行:

  1. 冒号 - http://example.com:88/testing像这样的URL正在输出域名,example.com:88而我希望它是example.com.

  2. IP地址 - http://188.123.44.12/test.php- 对于IP,它似乎正确地将IP地址输入数据库.在示例中它将188.123.44.12作为domain- 但我不想要那样输入.我只想要域名,所以如果是IP,就不应该复制它.应标示completeurl_feed,并移动到下一行.

  3. 子域名 - http://subdomain.whatever.example.com/test.html- 这是在我想要的时候输入到domain列中.subdomain.whatever.example.comexample.com

我可以考虑验证输入的域是否真的是域的唯一方法是对每个域运行whois查询.如果它没有作为有效的回复,它删除了第一个文本块.例如,它不会获得有效的结果,subdomain.whatever.example.com然后它会尝试whatever.example.com然后尝试example.com直到结果有效或者跳过它并将status列标记为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];
Run Code Online (Sandbox Code Playgroud)

Ale*_*rei 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;
Run Code Online (Sandbox Code Playgroud)

会输出

example.com
Run Code Online (Sandbox Code Playgroud)

如果你有url一个端口,parse_url将很容易处理它,例如

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

$data = parse_url($url);

print_r($data);
Run Code Online (Sandbox Code Playgroud)

会输出

Array
(
    [scheme] => http
    [host] => example.com
    [port] => 88
    [path] => /testing
)
Run Code Online (Sandbox Code Playgroud)

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

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

$data = parse_url($url);

print_r($data);

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

var_dump($hostIsIpAddress);
Run Code Online (Sandbox Code Playgroud)

哪个会输出bool(true)bool(false)分别输出