Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Upierdliwa walidacja linków, czyli jak zamienić & na & ?
Forum PHP.pl > Forum > Przedszkole
messmaker
Przykładowo, mam dany link:
  1. <a href="?a=1&b=2">link</a>


Walidator wypluje ostrzeżenie, że należy zamienić & na &amp;. Żaden problem, str_replace i po robocie. Problem się zaczyna jednak w momencie, gdy mamy do czynienia z linkiem pokroju:
  1. <a href="?a=1&b=2">&nbsp;link&nbsp;</a>


W tym momencie str_replace sprawi, że na stronie wyświetli się właśnie &nbsp;link&nbsp;.

Czy mógłbym prosić kogoś obeznanego w wyrażeniach regularnych o gotową preg_replace zamieniającą "&xxx=" na "&amp;xxx=", rzecz jasna niezależnie od xxx?
erix
Kod
#&[^nbsp;]#si

Powinno działać.

Nie pamiętam, czy & to znak specjalny; sprawdź preg_quote.
messmaker
Albo ja nie rozumiem, albo zawiodła komunikacja. &nbsp; powinno zostać nieruszone. Chodzi jedynie o podmianę & na &amp; tylko wtedy, kiedy są w linkach. Czyli na przykład wtedy, kiedy po nich pojawia się znak równości.
PiotrekM
Kod
preg_replace('/\&\=/si', '& a m p;', $str); // usun te spacje

?
messmaker
Nie bangla.

Po wywołaniu:
  1. $page="<a href=\"?a=1&b=2\">link&nbsp;link</a>";
  2. $page=preg_replace('/\&\=/si', '&amp;', $page);
  3. die("test - ".$page);


Otrzymuję:
  1. test - <a href="?a=1&b=2">link&nbsp;link</a>
PiotrekM
callbackiem
  1. $page='<a href="?a=1&b=2">link link</a>';
  2.  
  3. function parse($matches) {
  4. $matches[2] = preg_replace( '/\&/si', '&', $matches[2]);
  5. return '<' . $matches[1].'href="'.$matches[2].'"'.$matches[3].'>'.$matches[4].'</a>';
  6. }
  7. echo preg_replace_callback("/\<(.*?)href\=\"(.*?)\"(.*?)\>(.*?)\<\/a>/", "parse", $page);
messmaker
Udało się inaczej:

  1. $page=preg_replace("#\&[a-zA-Z0-9]\=#si", "&\\1=", $page);


Mimo wszystko dzięki za pomoc!
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.