Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Wyciąganie domeny z napisu
Forum PHP.pl > Forum > Przedszkole
craker
Witam,
napisałem sobie skrypt do wyciągania domeny z podanego adresu
Kod
preg_match ('#http:\/\/(www\.)?(.+?)\/#si' , $ala, $key);

czyli w $key[2] mam domenę i skrypt radzi sobie dobrze w przypadku adresu
http://www.adres.pl i http://adres.pl, ale gdy mam adres http://cos.adres.pl i http://www.cos.adres.pl to już jest problem, próbowałem dołożyć po www, że może wystąpić ciąg liter ale wtedy mi łapie też adres jeżeli teskt będzie adres.pl.
jak przerobić to wyrażenie tak aby z linków:
Kod
http://www.adres.pl
http://adres.pl
http://www.adres.pl/cos
http://adres.pl/cos
http://www.cos.adres.pl/
http://cos.adres.pl/

i innych kombinacji zawsze dawało samo adres.pl questionmark.gif

Dzięki za pomoc
rolnix
Wskazówka: wycinaj wszystko przed drugim (bądź pierwszym) i ostatnim znakiem "/", włącznie z nim samym. Potem pokrój wszystko poza ciągami sąsiadującymi z ostatnią z kolei kropką - w tym przypadku tymi ciągami będą "adres" i "pl". Napisałbym do tego kod, ale wybacz - już praktycznie usypiam winksmiley.jpg
craker
wybaczam, ale jak się przebudzisz i byłbyś tak miły to bardzo bym prosił o kod smile.gif
rolnix
  1. <?php
  2. function wyciagaj($str) {
  3. $fslash = strpos($str, '/');
  4. if ($fslash !== false) {
  5. if ($str[$fslash+1] == '/') $fslash++;
  6. $str = substr($str, $fslash+1);
  7. $fslash = strpos($str, '/');
  8. if ($fslash !== false) {
  9. $str = substr($str, 0, $fslash);
  10. }
  11. }
  12. $m = explode('.', $str);
  13. if (count($m) > 1) {
  14. return $m[count($m)-2].'.'.$m[count($m)-1];
  15. } else return $m[0];
  16. }
  17.  
  18.  
  19. echo wyciagaj('http://www.adres.pl');
  20. echo'<br>';
  21. echo wyciagaj('http://adres.pl');
  22. echo'<br>';
  23. echo wyciagaj('http://www.adres.pl/cos/cosssss.txt?cos=cos');
  24. echo'<br>';
  25. echo wyciagaj('http://adres.pl/cos');
  26. echo'<br>';
  27. echo wyciagaj('http://www.cos.adres.pl/');
  28. echo'<br>';
  29. echo wyciagaj('http://cos.adres.pl/');
  30. echo'<br>';
  31. echo wyciagaj('http:/cos.adres.pl/');
  32. ?>


Może i lamersko, ale bez PCRE. Powyższy kod siedem razy wyprodukował napis "adres.pl".
craker
dzięki wielkie naprawdę
rolnix
Nie ma za co winksmiley.jpg. Tylko nie chodzi o to, byś tylko skopiował tę funkcję; przeanalizuj sobie ją w spokoju - dobre ćwiczenie na przyszłość tongue.gif
craker
przepisałem trochu po swojemu, ale dziś mój system się wywalił, nie przewidziałem tego, a mianowicie jeśli mamy domenę
Kod
www.adres.com.pl
albo
Kod
adres.net.pl

to skrypt pokazuje jako domenę główną odpowiednio com.pl i net.pl co w tym wypadku jest nie do zaakceptowania. Możesz mi pomóc jeszcze z tym questionmark.gif

Dzięki
drPayton
Czy ten "adres" to jest zawsze jakaś konkretna wartość? Szukasz czegoś? Czy ogólnie chcesz po prostu domeny wyciągnąć? Jeśli to drugie to moim zdaniem nie da się. Co najwyżej pełną nazwę, czyli adres.pl ale i cos.adres.pl. I wtedy prosto za pomocą:
  1. <?php
  2. $domena = parse_url($adres, PHP_URL_HOST);
  3. ?>

Bo cos.adres.pl może być równie dobrze pełną nazwą jakiejś domeny, jak zmienną częścią domeny adres.pl (realizowane np przez virtual host) i skąd php ma to wiedzieć? No, chyba że dla każdej podanej wartości sprawdzał by to na serwerach dns...
craker
musi być adres samej domeny, czyliadres.pl, adres.com.pl itp, bo najego podstawie mam napisany mechanizm sprawdzania poprawności klucza licencyjnego, który jest przypisany strikte do domeny właśnie
dadexix
a jak byś ściągnął listę TLD i wyciągał wszystko przed tld..(pierwsze słowo przed TLD).. np skrypt z wyrażenia ala.makota.gm wyciąga tylko makota i gm(bo makota to pierwszy wyraz przed TLD) potem łączysz w całość...



Napewno gdzieś w necie będzie lista TLD...

o. np. to
http://techdictionary.com/domainlist.html
lub to:)
http://www.domainnews.pl/tld-list/
albo to
http://www.google.pl/search?q=%22lista+tld
drPayton
Musiałby rozbijać ciąg według kropki, a to się nie uda, bo jak napisałem nie wiem, czy cos.adres.pl to jest pełna nazwa domeny czy może 'cos' to określenie subdomeny.
Daimos
Cytat(drPayton @ 20.11.2007, 11:15:24 ) *
Musiałby rozbijać ciąg według kropki, a to się nie uda, bo jak napisałem nie wiem, czy cos.adres.pl to jest pełna nazwa domeny czy może 'cos' to określenie subdomeny.

no w takim wypadku, cos bedzie zawsze nazwa subdomeny, wiec nie rozumiem w czym problem ;>
drPayton
Nie wnikam w szczegóły techniczne, bo specem nie jestem, ale podam prosty przykład:
del.icio.us
Zgodnie z Tym co mówicie, @craker otrzyma jedynie icio.us, a chyba nie o to chodzi winksmiley.jpg
craker
dokładnie. problem jest w tym że jak mam adres moja-strona.net.pl, to zwróci mi samo net.pl, a w tym przypadku nie jest to adres strony. co do tld to nie bardzo to jest możliwe, bo skrypt klienta sprawdza domene z kluczem jaki dostanie ode mnie i na tej podstawie sprawdzane jest czy skrypt zostal zakupiony czy nie, calosc zakodowana jest zendem wiec nikt nic nie widzi, ale dodajac za duzo nie potrzebnie zwiekszam objetosc plikow a tutaj chodzi o cos prostego,ato jest najlepsze zabezpieczenie wg. mnie
Nattfarinn
Taka nieśmiała prozpozycja, bo nie mam na chwilę obecną możliwości sprawdzenia czy to w ogóle ma sens, ale może jakimś wyjściem byłoby sprawdzać URL od końca pod kątem tego czy istnieje odpowiedź serwera z podanego adresu. Pierwszy argument (w URL ostatni) z góry pominąć jako TLD.

Dla przykładu sprawdznie adresu: "subdomena.domena.net.pl" wyglądałoby: Czy jest odpowiedź z "net.pl"? Jeśli nie ma to sprawdź czy jest odpowiedź z "domena.net.pl" itd. Przerwij gdy jest odpowiedź i zwróć sprawdzany adres (w tym przypadku "domena.net.pl"). Domyślam się jednak, że takie sprawdzanie (np. gethostbyname) będzie generowało pewne opóźnienie w oczekiwaniu na odpowiedź. Zawsze można to odpalać tylko raz na sesję, ale to chyba takie "zamiatanie pod dywan".

Pozdrawiam!
-- Nattfarinn
lubomir1973
Zainteresował mnie temat i napisałem takiego sprawdzacza:

Kod
function sprawdz($url) {
   $a = curl_init($url);
   curl_setopt($a, CURLOPT_NOBODY, true);
   curl_exec($a);
   $kodbledu = curl_getinfo($a, CURLINFO_HTTP_CODE);
   curl_close($a);
   return $kodbledu;
}


Widze, że działa ale pytanie czy to dobre rozwiązanie aby sprawdzić że adres istnieje?
Snowak
Zamiast prega możesz po prostu rozbić adres funkcją parse_url (http://pl.php.net/manual/pl/function.parse-url.php), i użyć czegoś takiego:
  1. <?php
  2. $host = parse_url('http://cos.adres.pl', PHP_URL_HOST);
  3. $rec = explode('.', $host);
  4. $domena = $rec[count($rec) - 1];
  5. $adres = $rec[count($rec) - 2];
  6. echo($adres . '.' . $domena);
  7. //Zwróci adres.pl
  8. ?>
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.