Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Regex do preg_match - odróżnienie "uk" od "co.uk"
Forum PHP.pl > Forum > PHP
warder
Cześć

próbuje wyciągnąć nazwę domeny, jednak mam problem z odróżnieniem np. "uk" od "co.uk"

W jaki sposób mogę ustawić, by brany był pod uwagę największy znaleziony string, gdy robię normalnego preg_matcha i używam do tego (co.uk|uk) to zawsze wybiera uk, nie ważne czy jest pierwsze, czy drugie na liście...

Jest na to jakiś sposób?
nospor
(co\.)?uk
warder
Próbowałem już tak, jednak nie potrafię wyciągnąć poprawnie całego rozszerzenia gdy występuje co.uk


Przykład dla domeny z samym .uk:
Kod
<?php
function parseUrl($url) {
    $r  = "^(?:(?<start>\w+)://)?";
    $r .= "(?<host>(?:(?P<subdomena>[\w\.]+)\.)?" . "(?<domena>\w+)\.(?<extension>(co\.)?uk))";
    $r .= "(?::(?<port>\d+))?";
    $r .= "(?<path>[\w/]*/(?<file>\w+(?:\.\w+)?)?)?";
    $r .= "(?:\?(?<arg>[\w=&]+))?";
    $r .= "(?:#(?<anchor>\w+))?";
    $r = "!$r!";                                                // Delimiters

    preg_match ( $r, $url, $out );

    return $out;
}
echo "<pre>";
print_r ( parseUrl ( 'https://www.test.domeny.uk' ) );
echo "</pre>";
?>


można sprawdzić tutaj: http://sandbox.onlinephpfunctions.com/code...6b541a55b2a07ad - działa ok


ale.. przy co.uk już się sypie: http://sandbox.onlinephpfunctions.com/code...01082c63696331e

Można jakoś ustawic, by wybierał dłuższego stringa jeśli taki istnieje?
nospor
No ale przeciez co jest lapane przez domene
warder
Tak, ale gdy podam inny pattern dla samego rozszerzenia np. com|pl|de to wszystko działa, problem występuje przy domenach dwuczęściowych.. :/

Albo jeśli ten sposób nie jest najlepszy, to jak inaczej mogę sprawdzić, czy domena zawiera rozszerzenie podane w oddzielnej tablicy dozwolonych rozszerzeń?


Ok, użyłem skryptu http://w-shadow.com/blog/2012/08/28/tldextract/ do wyciągania samych rozszerzeń, póki co nie zauważyłem żadnego błędu smile.gif
Pozdrawiam!
Crozin
1. Dlaczego nie użyjesz parse_url?
2. Przygotuj sobie listę dozwolonch domen i korzystając np. z funkcji endsWith() stąd http://stackoverflow.com/questions/834303/...unctions-in-php porównaj podany URL z każdym z elementów listy.
nospor
$r .= "(?<host>(?sad.gif?P<subdomena>[\w\.]+)\.)?" . "(?<domena>\w+[^co])\.(?<extension>(co\.)?uk))";
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.