Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyrażenie regularne do łącz
Forum PHP.pl > Forum > PHP
no-scared
Witam ponownie.

Otóż chciałbym zrobić sobie wyrażenie regularne wychwytujące wszystkie łącza (hrefy), ponieważ chce sprawdzac jakie łącza dają użytkownicy w komentarzach na mojej stronie i dodawać je do bazy, robiłem już ileś matchów jednak im bardziej starałem się poprawić, tym bardziej go niszczyłem i już kompletnie zaczął mi się mózg lansować.

$preg = preg_match_all('/<a.*href\s*=(?:\s*|\s*"|\s*\')([^\s>]+)(?:\s*?"|\s*?\'|\s*|\s*>)/i', $text, $url_list, PREG_PATTERN_ORDER);

Proszę o pomoc.

// EDIT

do moderatorow, musiałem usunąć BBCode, ponieważ forum mi docinało regexa

jakieś pomysły?
em1X
mózg może się lasować.. lansują się gwiazdy w telewizji

  1. <?php
  2. $match = preg_match_all('/<a.*?href="(.*?)".*?>.*?</a>/i', $text, $url_list);
  3. ?>
no-scared
Cytat(em1X @ 31.08.2008, 23:26:33 ) *
mózg może się lasować.. lansują się gwiazdy w telewizji

  1. <?php
  2. $match = preg_match_all('/.*?</a>/i', $text, $url_list);
  3. ?>

em1X mialem podobnego regexa na samym początku, jednak co jeśli łącza będą takie:

<a href='costam'>łącze</a>
<a href=costam>łącze</a>
em1X
możesz zrobić trzy oddzielne wyrażenia dla każdego przypadku.
delfinium
em1X: ale po co dla każdego przypadku osobno?

  1. <?php
  2. $match = preg_match_all('/<a.*?href=('|"|)(.*?)('|"|)>.*?</a>/i', $href, $url_list );
  3. ?>


to rozwala linki z pojedynczymi i podwójnymi "uszami" i te bez też
em1X
jeden kij, btw Twój regexp nie złapałby linka w postaci: <a href=http://onet.pl title="cos"> więc małą modyfikację wypadałoby dodać

  1. <?php
  2. $match = preg_match_all('/<a.*?href=('|"|)(.*?)('|"|).*?>.*?</a>/i', $href, $url_list );
delfinium
faktycznie, z rozpędu zabrakło jednego .*?. dzięki za poprawkę
no-scared
jeszcze mały problem, bo już chce rozdać plusy, ale żeby do końca smile.gif

regex em1X wyłapuje także takie przypadki:

http://php.sum1.pl/?kat=9&p=7" onFocus=blur(); class=link

nie wiem dokladnie czemu, bo na koncu linka jest cudzyslow a on pobiera dalej.

Próbowałem coś takiego:

'/<a.*?href=(?:\'|"|)(^"\'\s)*?(?:\'|"|)>.*?<\/a>/i'

ale mi wtedy nic nie pobiera...
Kicok
Wrzucałem już tu kiedyś podobne wyrażenie. Powinno łapać wszystkie adresy:
  1. <?php
  2.  
  3. $text = 'aaa <a alt="aaa" href="http://aaa.pl/aaa.html" title="aaa">aaa</a> aaa
  4.  bbb <a alt='bbb' href='http://bbb.pl/bbb.html' title='bbb'>bbb</a> bbb
  5.  ccc <a alt=ccc href=http://ccc.pl/ccc.html title=ccc>ccc</a> ccc';
  6.  
  7.  
  8. preg_match_all( '#<as[^>]*hrefs*=s*("|')?(.*?)(?(1)1.*?>|(?:s.*?>|>))(.*?)</a>#si', $text, $matches );
  9.  
  10. echo '<pre>';
  11. print_r( $matches );
  12. echo '</pre>';
  13.  
  14. ?>
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.