Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> wyrażenie regularne - linki pod sobą
nospor
post
Post #1





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Mam taki kod:
  1. $m="http://test.pl\nhttp://test.pl\nhttp://test.pl\nhttp://test.pl";
  2. $search = array (
  3. '#([^/]|^)(www\..*?\..*?)(\s|$)#si',
  4. '#([^">]|^)(https?://.*?\..*?)(\s|$)#si'
  5. );
  6. $replace = array(
  7. '\\1<a href="http://\\2">\\2</a>\\3',
  8. '\\1<a href="\\2">\\2</a>\\3'
  9. );
  10. $m = preg_replace($search, $replace, $m);
  11. $m = nl2br($m);
  12. echo $m;

Jego zadaniem jest zamiant tekstów linkowych na pełne linki w kodzie html. Jednak gdy teksty linkowe oddzielone są od siebie \n to na linki zamienia mi co drugi link tekstowy. Gdyby były oddzielone \r\n tp by zamieniał wszystkie na linki.
W czym problem? Nie chcę tego obchodzić na zasadzie podmianiania \n na \r\n. Chciałbym to załatwić przez właściwe wyrażenie regularne.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
by_ikar
post
Post #2





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Też uważam że lepiej to zrobić callbackiem, i działający przykład dałem tutaj: http://forum.php.pl/index.php?showtopic=18...t-member-912891

Ale również można całość machnąć w jednym wyrażeniu, używając negatywnego przewidywania wstecznego i takie wyrażenie wyglądać będzie w ten sposób:

Kod
#(?<!["'>]) ((f|ht)tp(s)?://[^\s]+)#is


A działać będzie w taki sposób: http://gskinner.com/RegExr/?2vrhs Oczywiście wyrażenie do przechwytywania linków dostosujesz już pod swoje wymagania, osobiście używam takiego, ponieważ często w tekście można napisać www dodając kropkę i powstają niepotrzebnie linki (IMG:style_emoticons/default/wink.gif)

BTW w przypadku kiedy będziesz szukać linków również po www, to moja metoda jak i wszystkich innych którzy tutaj podali jakieś rozwiązanie, będzie działać nieprawidłowo. Z prostego względu, kiedy szukasz linków po www, a wykluczasz jedynie apostrof/cudzysłów, wówczas mając w kodzie html link zaczynający się od http, taki link również zostanie złapany. Czyli prócz samego wykluczania apostrofu/cudzysłowia, musiałbyś jeszcze wykluczyć ftp/http/https i pewnie jeszcze kilka innych protokołów. Dlatego lepiej wyszukiwanie linku po www sobie darować (IMG:style_emoticons/default/wink.gif) chyba że ci na tym zależy, to trzeba by wówczas pokombinować.. (IMG:style_emoticons/default/wink.gif)

EDIT: małe poprawki w wyrażeniu, zapomniałem o spacji i łapało za dużo.. Ogólnie to widzę że to i tak nie jest idealne rozwiązanie i będzie trzeba trochę pokombinować żeby to jakoś działało. Jednak lepszy callback (IMG:style_emoticons/default/wink.gif)

Ten post edytował by_ikar 27.01.2012, 20:34:16
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 11.10.2025 - 16:41