preg_match_all - get src from img tag php
AnĂ¡lisis de dominio desde URL en PHP (18)
Necesito construir una función que analice el dominio desde una URL.
Entonces, con
http://google.com/dhasjkdas/sadsdds/sdda/sdads.html
o
http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html
debe devolver google.com
con
http://google.co.uk/dhasjkdas/sadsdds/sdda/sdads.html
debería devolver google.co.uk
.
Aquí está el código que hice que el 100% encuentra solo el nombre de dominio, ya que lleva a mozilla sub tlds a la cuenta. Lo único que tiene que comprobar es cómo hace la memoria caché de ese archivo, por lo que no consulta mozilla todo el tiempo.
Por alguna extraña razón, dominios como co.uk no están en la lista, por lo que debes realizar algunas operaciones de piratería y agregarlas manualmente. No es la solución más limpia, pero espero que ayude a alguien.
//=====================================================
static function domain($url)
{
$slds = "";
$url = strtolower($url);
$address = ''http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1'';
if(!$subtlds = @kohana::cache(''subtlds'', null, 60))
{
$content = file($address);
foreach($content as $num => $line)
{
$line = trim($line);
if($line == '''') continue;
if(@substr($line[0], 0, 2) == ''/'') continue;
$line = @preg_replace("/[^a-zA-Z0-9/.]/", '''', $line);
if($line == '''') continue; //$line = ''.''.$line;
if(@$line[0] == ''.'') $line = substr($line, 1);
if(!strstr($line, ''.'')) continue;
$subtlds[] = $line;
//echo "{$num}: ''{$line}''"; echo "<br>";
}
$subtlds = array_merge(Array(
''co.uk'', ''me.uk'', ''net.uk'', ''org.uk'', ''sch.uk'', ''ac.uk'',
''gov.uk'', ''nhs.uk'', ''police.uk'', ''mod.uk'', ''asn.au'', ''com.au'',
''net.au'', ''id.au'', ''org.au'', ''edu.au'', ''gov.au'', ''csiro.au'',
),$subtlds);
$subtlds = array_unique($subtlds);
//echo var_dump($subtlds);
@kohana::cache(''subtlds'', $subtlds);
}
preg_match(''/^(http:[//]{2,})?([^//]+)/i'', $url, $matches);
//preg_match("/^(http:////|https:////|)[a-zA-Z-]([^//]+)/i", $url, $matches);
$host = @$matches[2];
//echo var_dump($matches);
preg_match("/[^/.//]+/.[^/.//]+$/", $host, $matches);
foreach($subtlds as $sub)
{
if (preg_match("/{$sub}$/", $host, $xyz))
preg_match("/[^/.//]+/.[^/.//]+/.[^/.//]+$/", $host, $matches);
}
return @$matches[0];
}
Aquí mi rastreador basado en las respuestas anteriores.
- Implementación de clase (Me gusta Obj :)
- usa
Curl
para que podamos usar http auth es obligatorio - solo rastrea el enlace que pertenece al dominio de la url de inicio
- imprime el código de respuesta del encabezado http (útil para verificar problemas en un sitio)
CÓDIGO DE CLASE CRAWL
class crawler
{
protected $_url;
protected $_depth;
protected $_host;
public function __construct($url, $depth = 5)
{
$this->_url = $url;
$this->_depth = $depth;
$parse = parse_url($url);
$this->_host = $parse[''host''];
}
public function run()
{
$this->crawl_page($this->_url, $this->_depth = 5);
}
public function crawl_page($url, $depth = 5)
{
static $seen = array();
if (isset($seen[$url]) || $depth === 0) {
return;
}
$seen[$url] = true;
list($content, $httpcode) = $this->getContent($url);
$dom = new DOMDocument(''1.0'');
@$dom->loadHTML($content);
$this->processAnchors($dom, $url, $depth);
ob_end_flush();
echo "CODE::$httpcode, URL::$url <br>";
ob_start();
flush();
// echo "URL:", $url, PHP_EOL, "CONTENT:", PHP_EOL, $dom->saveHTML(), PHP_EOL, PHP_EOL;
}
public function processAnchors($dom, $url, $depth)
{
$anchors = $dom->getElementsByTagName(''a'');
foreach ($anchors as $element) {
$href = $element->getAttribute(''href'');
if (0 !== strpos($href, ''http'')) {
$path = ''/'' . ltrim($href, ''/'');
if (extension_loaded(''http'')) {
$href = http_build_url($url, array(''path'' => $path));
} else {
$parts = parse_url($url);
$href = $parts[''scheme''] . ''://'';
if (isset($parts[''user'']) && isset($parts[''pass''])) {
$href .= $parts[''user''] . '':'' . $parts[''pass''] . ''@'';
}
$href .= $parts[''host''];
if (isset($parts[''port''])) {
$href .= '':'' . $parts[''port''];
}
$href .= $path;
}
}
// Crawl only link that belongs to the start domain
if (strpos($href, $this->_host) !== false)
$this->crawl_page($href, $depth - 1);
}
}
public function getContent($url)
{
$handle = curl_init($url);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
/* Get the HTML or whatever is linked in $url. */
$response = curl_exec($handle);
/* Check for 404 (file not found). */
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
if ($httpCode == 404) {
/* Handle 404 here. */
}
curl_close($handle);
return array($response, $httpCode);
}
}
// USAGE
$startURL = ''http://YOUR_START_ULR'';
$depth = 2;
$crawler = new crawler($startURL, $depth);
$crawler->run();
Combinando las respuestas de worldofjr y Alix Axel en una pequeña función que manejará la mayoría de los casos de uso:
function get_url_hostname($url) {
$parse = parse_url($url);
return str_ireplace(''www.'', '''', $parse[''host'']);
}
get_url_hostname(''http://www.google.com/example/path/file.html''); // google.com
Descubrí que la solución de @ philfreo (a la que se hace referencia en php.net) es bastante buena para obtener buenos resultados, pero en algunos casos muestra el mensaje de "aviso" y "Normas estrictas" de php. Aquí una versión fija de este código.
function getHost($url) {
$parseUrl = parse_url(trim($url));
if(isset($parseUrl[''host'']))
{
$host = $parseUrl[''host''];
}
else
{
$path = explode(''/'', $parseUrl[''path'']);
$host = $path[0];
}
return trim($host);
}
echo getHost("http://example.com/anything.html"); // example.com
echo getHost("http://www.example.net/directory/post.php"); // www.example.net
echo getHost("https://example.co.uk"); // example.co.uk
echo getHost("www.example.net"); // example.net
echo getHost("subdomain.example.net/anything"); // subdomain.example.net
echo getHost("example.net"); // example.net
Desde http://us3.php.net/manual/en/function.parse-url.php#93983
por alguna extraña razón, parse_url devuelve el host (por ejemplo, example.com) como la ruta cuando no se proporciona ningún esquema en la url de entrada. Así que escribí una función rápida para obtener el host real:
function getHost($Address) {
$parseUrl = parse_url(trim($Address));
return trim($parseUrl[''host''] ? $parseUrl[''host''] : array_shift(explode(''/'', $parseUrl[''path''], 2)));
}
getHost("example.com"); // Gives example.com
getHost("http://example.com"); // Gives example.com
getHost("www.example.com"); // Gives www.example.com
getHost("http://example.com/xyz"); // Gives example.com
Echa un vistazo a parse_url()
:
$url = ''http://google.com/dhasjkdas/sadsdds/sdda/sdads.html'';
$parse = parse_url($url);
echo $parse[''host'']; // prints ''google.com''
parse_url
no maneja muy bien las urls muy maltratadas, pero está bien si, en general, se esperan URL decentes.
Echa un vistazo a parse_url()
El código que estaba destinado a funcionar al 100% no pareció cortarlo para mí, paré un poco el ejemplo pero encontré un código que no me ayudaba y tuve problemas con él. así que lo cambié a un par de funciones (para guardar preguntando por la lista de Mozilla todo el tiempo, y eliminando el sistema de caché). Esto se ha probado en un conjunto de 1000 URL y parecía funcionar.
function domain($url)
{
global $subtlds;
$slds = "";
$url = strtolower($url);
$host = parse_url(''http://''.$url,PHP_URL_HOST);
preg_match("/[^/.//]+/.[^/.//]+$/", $host, $matches);
foreach($subtlds as $sub){
if (preg_match(''//.''.preg_quote($sub).''$/'', $host, $xyz)){
preg_match("/[^/.//]+/.[^/.//]+/.[^/.//]+$/", $host, $matches);
}
}
return @$matches[0];
}
function get_tlds() {
$address = ''http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1'';
$content = file($address);
foreach ($content as $num => $line) {
$line = trim($line);
if($line == '''') continue;
if(@substr($line[0], 0, 2) == ''/'') continue;
$line = @preg_replace("/[^a-zA-Z0-9/.]/", '''', $line);
if($line == '''') continue; //$line = ''.''.$line;
if(@$line[0] == ''.'') $line = substr($line, 1);
if(!strstr($line, ''.'')) continue;
$subtlds[] = $line;
//echo "{$num}: ''{$line}''"; echo "<br>";
}
$subtlds = array_merge(array(
''co.uk'', ''me.uk'', ''net.uk'', ''org.uk'', ''sch.uk'', ''ac.uk'',
''gov.uk'', ''nhs.uk'', ''police.uk'', ''mod.uk'', ''asn.au'', ''com.au'',
''net.au'', ''id.au'', ''org.au'', ''edu.au'', ''gov.au'', ''csiro.au''
), $subtlds);
$subtlds = array_unique($subtlds);
return $subtlds;
}
Entonces úsalo como
$subtlds = get_tlds();
echo domain(''www.example.com'') //outputs: example.com
echo domain(''www.example.uk.com'') //outputs: example.uk.com
echo domain(''www.example.fr'') //outputs: example.fr
Sé que debería haber convertido esto en una clase, pero no tuve tiempo.
Esto generalmente funcionará muy bien si la URL de entrada no es basura total. Elimina el subdominio.
$host = parse_url( $Row->url, PHP_URL_HOST );
$parts = explode( ''.'', $host );
$parts = array_reverse( $parts );
$domain = $parts[1].''.''.$parts[0];
Ejemplo
Entrada: http://www2.website.com:8080/some/file/structure?some=parameters
Salida: website.com
Estoy agregando esta respuesta tarde ya que esta es la respuesta que aparece más en Google ...
Puedes usar PHP para ...
$url = "www.google.co.uk";
$host = parse_url($url, PHP_URL_HOST);
// $host == "www.google.co.uk"
para agarrar el host pero no el dominio privado al que se refiere el host. (Ejemplo: www.google.co.uk
es el host, pero google.co.uk
es el dominio privado)
Para obtener el dominio privado, debe conocer la lista de sufijos públicos a los que se puede registrar un dominio privado. Esta lista es curada por Mozilla en https://publicsuffix.org/
El código siguiente funciona cuando ya se ha creado una matriz de sufijos públicos. Simplemente llame
$domain = get_private_domain("www.google.co.uk");
con el código restante ...
// find some way to parse the above list of public suffix
// then add them to a PHP array
$suffix = [... all valid public suffix ...];
function get_public_suffix($host) {
$parts = split("/.", $host);
while (count($parts) > 0) {
if (is_public_suffix(join(".", $parts)))
return join(".", $parts);
array_shift($parts);
}
return false;
}
function is_public_suffix($host) {
global $suffix;
return isset($suffix[$host]);
}
function get_private_domain($host) {
$public = get_public_suffix($host);
$public_parts = split("/.", $public);
$all_parts = split("/.", $host);
$private = [];
for ($x = 0; $x < count($public_parts); ++$x)
$private[] = array_pop($all_parts);
if (count($all_parts) > 0)
$private[] = array_pop($all_parts);
return join(".", array_reverse($private));
}
He editado para ti:
function getHost($Address) {
$parseUrl = parse_url(trim($Address));
$host = trim($parseUrl[''host''] ? $parseUrl[''host''] : array_shift(explode(''/'', $parseUrl[''path''], 2)));
$parts = explode( ''.'', $host );
$num_parts = count($parts);
if ($parts[0] == "www") {
for ($i=1; $i < $num_parts; $i++) {
$h .= $parts[$i] . ''.'';
}
}else {
for ($i=0; $i < $num_parts; $i++) {
$h .= $parts[$i] . ''.'';
}
}
return substr($h,0,-1);
}
Todos los tipos de url (www.domain.ltd, sub1.subn.domain.ltd resultarán en: domain.ltd.
Puede pasar PHP_URL_HOST en la función parse_url como segundo parámetro
$url = ''http://google.com/dhasjkdas/sadsdds/sdda/sdads.html'';
$host = parse_url($url, PHP_URL_HOST);
print $host; // prints ''google.com''
Si desea extraer el host de la cadena http://google.com/dhasjkdas/sadsdds/sdda/sdads.html
, el uso de parse_url () es una solución aceptable para usted.
Pero si desea extraer el dominio o sus partes, necesita un paquete que use la Lista de sufijos públicos . Sí, puede usar funciones de cadena alrededor de parse_url (), pero a veces producirá resultados incorrectos.
Recomiendo TLDExtract para el análisis de dominio, aquí hay un código de muestra que muestra diff:
$extract = new LayerShifter/TLDExtract/Extract();
# For ''http://google.com/dhasjkdas/sadsdds/sdda/sdads.html''
$url = ''http://google.com/dhasjkdas/sadsdds/sdda/sdads.html'';
parse_url($url, PHP_URL_HOST); // will return google.com
$result = $extract->parse($url);
$result->getFullHost(); // will return ''google.com''
$result->getRegistrableDomain(); // will return ''google.com''
$result->getSuffix(); // will return ''com''
# For ''http://search.google.com/dhasjkdas/sadsdds/sdda/sdads.html''
$url = ''http://search.google.com/dhasjkdas/sadsdds/sdda/sdads.html'';
parse_url($url, PHP_URL_HOST); // will return ''search.google.com''
$result = $extract->parse($url);
$result->getFullHost(); // will return ''search.google.com''
$result->getRegistrableDomain(); // will return ''google.com''
Simplemente usa como seguir ...
<?php
echo $_SERVER[''SERVER_NAME''];
?>
parse_url no funcionó para mí. Solo devolvió el camino. Cambiando a lo básico usando php5.3 +:
$url = str_replace(''http://'', '''', strtolower( $s->website));
if (strpos($url, ''/'')) $url = strstr($url, ''/'', true);
$domain = parse_url($url, PHP_URL_HOST);
echo implode(''.'', array_slice(explode(''.'', $domain), -2, 2))
$domain = str_ireplace(''www.'', '''', parse_url($url, PHP_URL_HOST));
Esto devolvería google.com
para ambos http://google.com/ ... y http://www.google.com/ ...
function get_domain($url = SITE_URL)
{
preg_match("/[a-z0-9/-]{1,63}/.[a-z/.]{2,6}$/", parse_url($url, PHP_URL_HOST), $_domain_tld);
return $_domain_tld[0];
}
get_domain(''http://www.cdl.gr''); //cdl.gr
get_domain(''http://cdl.gr''); //cdl.gr
get_domain(''http://www2.cdl.gr''); //cdl.gr