Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyciąganie URL z ciągu
Forum PHP.pl > Forum > Przedszkole
thepiotr
Cześć. Nie mam pojęciia na temat wyrażeń regularnych więc piszę by ktoś mi pomógł.
Mój problem polega na wyciągnięciu URL z ciągu np. "sdsad sdf sdf google.com asdsds", by zostało z tego google.com.
Najlepiej by skrypt wyciągał nawet kilka URL. Potrzebne jest mi to do blokady antyspamowej, każdy taki link będzie walidowany przez inny skrypt który będzie sprawdzał czy strona istnieje, nie jest zapętlona itp.

Chyba że już istnieje takie coś i jest udostępnione za darmo to proszę podać jakieś linki do tego lub kod biggrin.gif.
freewalker
jeśli chcesz wyciągnąć tylko google.com i zawsze google.com, to chyba lepiej sprawdzić czy jest google.com w adresie za pomocą

  1. if(eregi("google.com",$url)==true)
  2. {
  3. // wykonaj jeśli znajdzie google.com w adresie;
  4. }

thepiotr
nie chodzi mi o konkretny adres jak np. google.com tylko o ten który się znajdzie w ciągu, najpierw domeny np. (pl,com,eu,info,biz,org,...) i jak w ciągu będzie krpoka przed tą nazwą domeny to "asd fdf google.com sdfg dfsg" to skrypt wyciągnie wyraz od .com wstecz do pierwszej spacji wstecz w tym przypadku google.com.
blahy
najlatwiej wyrazeniami regularnymi.
jesli nie to zostaje explode po spacji i analizowanie kazdego slowa w petli.

ponizej prosty regex, ktory powinien zadzialac dla opsanych przez Ciebie warunkow (mozna dodac dodatkowe domeny)
  1. php > preg_match_all('/(?:[a-z-]+\.)+(com|pl)/', 'aaa aaa.asd.com asd bb.bb ddads e.pl asd.asd wp.pl eeda as-de.com.pl', $a);
  2. php > var_dump($a);
  3. array(2) {
  4. [0] =>
  5. array(4) {
  6. [0] =>
  7. string(11) "aaa.asd.com"
  8. [1] =>
  9. string(4) "e.pl"
  10. [2] =>
  11. string(5) "wp.pl"
  12. [3] =>
  13. string(12) "as-de.com.pl"
  14. }
  15. [1] =>
  16. array(4) {
  17. [0] =>
  18. string(3) "com"
  19. [1] =>
  20. string(2) "pl"
  21. [2] =>
  22. string(2) "pl"
  23. [3] =>
  24. string(2) "pl"
  25. }
  26. }


wynik w $a[0]
thepiotr
Dzięki, mógłbyś jeszcze napisać jak wywołać te tablice bo kod niby działa nie pokazuje błędu a gdy na początku dam echo"x"; to nic nie wyświetla
  1. <?php
  2. echo"x";
  3. ini_set('display_errors', 1);
  4.  
  5. preg_match_all('/(?:[a-z-]+\.)+(com|pl)/', 'aaa aaa.asd.com asd bb.bb ddads e.pl asd.asd wp.pl eeda as-de.com.pl', $a);
  6. var_dump($a);
  7. array(2) {
  8. [0] =>
  9. array(4) {
  10. [0] =>
  11. string(11) "aaa.asd.com"
  12. [1] =>
  13. string(4) "e.pl"
  14. [2] =>
  15. string(5) "wp.pl"
  16. [3] =>
  17. string(12) "as-de.com.pl"
  18. }
  19. [1] =>
  20. array(4) {
  21. [0] =>
  22. string(3) "com"
  23. [1] =>
  24. string(2) "pl"
  25. [2] =>
  26. string(2) "pl"
  27. [3] =>
  28. string(2) "pl"
  29. }
  30. }
  31.  
  32. echo $a[0][1];
  33. echo $a[1][1];
  34.  
  35. ?>
blahy
nie za bardzo rozumiem co to znaczy, ze nic nie wyswietla. X tez nie wyswietla? czy pozniej nic nie wyswietla?
w dumpie masz ze w wyniku pod kluczem 0 sa 4 domeny. powinno sie dac wypisac je tak jak zrobiles.
moze to cos pomoze:

  1. php > $result = null; // inicjalizacja zmiennej na wynik, ktora przekazemy przez referencje do preg_match_all
  2. php > $matchesCount = preg_match_all('/(?:[a-z-]+\.)+(com|pl)/', 'aaa aaa.asd.com asd bb.bb ddads e.pl asd.asd wp.pl eeda as-de.com.pl', $result); // to co wyzej - wynik do zmiennej $result a liczbe zwroconych domen do $matchesCount
  3. php > if (false === $matchesCount) die('error'); // wywolanie preg_match_all nie powinno zwrocic false
  4. php > echo 'found ' . $matchesCount . ' domains'; // ile domen znaleziono
  5. found 4 domains
  6. php > foreach ($result[0] as $domain) {echo $domain . PHP_EOL;} // iterowanie po wynikach
  7. aaa.asd.com
  8. e.pl
  9. wp.pl
  10. as-de.com.pl
thepiotr
Dzięki smile.gif właśnie o coś takiego mi chodziło biggrin.gif
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.