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
nospor
post
Post #2





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




Nie, nie ma haczyka, poprostu nie działa (IMG:style_emoticons/default/smile.gif)
Twój sposób działa dla tego przypadku.
A jesteś w stanie powiedzieć co w moim wyrażeniu jest nie tak, że nie działa?

Początek mojego wyrażenia, czyli o to: ([^">]|^) psuje wszystko. Twoje działa bo nie ma tego początku (IMG:style_emoticons/default/smile.gif)
No ale ja ten początek muszę mieć. Idzie to jakoś poprawić?
Go to the top of the page
+Quote Post
zegarek84
post
Post #3





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(nospor @ 27.01.2012, 18:37:59 ) *
A jesteś w stanie powiedzieć co w moim wyrażeniu jest nie tak, że nie działa?

co drugie masz, gdyż na końcu wyrażenie dopasowywało Ci się do białego znaku, tam było kończone wyszukiwanie i za tym białym znakiem rozpoczynana była następna próba dopasowania - a ponieważ nie było już białego znaku (innego znaku niż w pierwszym warunku) próbowało się dopasować do pustych znaków na początku, które nie były puste, gdyż już jest tekst na początku...

moja propozycja która wstępnie działa:
  1. $m="http://test.pl\nhttp://test.pl\nhttp://test.pl\nhttp://test.pl";
  2. $search = array (
  3. '#([^/]|^)(www\.[^\s]+\.[^\s]{2,5})#si',
  4. '#([^">\']|^)(https?://[^\s]+\.[^\s]{2,5})#si'
  5. );
  6. $replace = array(
  7. '\\1<a href="http://\\2">\\2</a>',
  8. '\\1<a href="\\2">\\2</a>'
  9. );
  10. $m = preg_replace($search, $replace, $m);
  11. $m = nl2br($m);
  12. echo $m;

propozycja Uriziel01 bez modyfikatora s też powinna działać po dodaniu na początku ([^">\']|^) - oczywiście cyferki się zmienią - ale mi się sprawdzać nie chce
po za tym nie lepiej skorzystać z callbacka przy zamianie bardziej złożonego ciągu?? - można wtedy dorzucić kilka ekstra sprawdzeń...

Ten post edytował zegarek84 27.01.2012, 21:56:02
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: 9.10.2025 - 23:37