Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP repleace kontra bardzo skomplikowane podmiany...
Forum PHP.pl > Forum > PHP
ahold
Witam,

Walcze w pewnym problemem, pokażę dane wejściowe abyśmy mogli zobaczyć tematykę.


Przykładowy input:

  1. <a id="moj_tag" rel="test" alt="kot" href="/winowajca">


ew
  1. <a id="moj_tag" alt="test" blabla="/pp/ppp/ppp">

lub
  1. <a id="moj_tag" alt="test" blabla="ppp.ppp.ppp.ppp">



Repleace ma w tych wypadkach:

<a id="moj_tag" alt="test" blabla="moj_tekst/ppp/ppp/pp">

lub

<a id="moj_tag" alt="test" blabla="moj_tekst">


Standardowe repleace, jest dobre tylko jeżeli tag blabla jest od razu za A.
<a blabla="">

Wtedy piszę
$odebrane = str_replace('<a blabla="', '<a blabla="xxx/', "$odebrane");


I mamy problem rozwiązany...
Ale zasadniczo zawsze po a daje się href...
więc repleace nie działa bo znie znam adresu href, albo co jeżeli ktoś wpiszę trzecie z rzędu zamiast drugie....

Moje pytanie brzmi, jak zrobić coś co będzie działało dla tagu blabla pod warunkiem że będzie on w <a>


Logicznie:

IF <a> THEN
SZUKAJ blabla="
ZMIEN na blabla="xxx/xxx/
END

ELSE
NIC


Jeżeli źle objaśniłem, to proszę skarżyć się, wytłumaczę albo rozrysuję...

Opcjonalnie, chciał bym, aby wyciągało również wartość tego tagu przed zamianą, tak aby można zmodyfikować jej treść (przeflitrować).
redeemer
Troszkę źle do tego podchodzisz.

Jak wiadomo str_replace służy do zamiany stringów.
Chcesz zamienić blabla=" na blabla="xxx/xxx/ ?
To dlaczego piszesz
  1. $odebrane = str_replace('<a blabla="', '<a blabla="xxx/', "$odebrane");

zamiast
  1. $odebrane = str_replace(' blabla="', ' blabla="xxx/', "$odebrane");

Nie musisz także zmiennych karać i zamykać je pomiędzy "".

paw-e-l
bo on chce tylko atrybuty w tagach <a> podmieniać a nie we wszystkich znacznikach. Jedynym wyjściem z sytuacji będzie użycie wyrażeń regularnych w preg_replace
ahold
Dokładnie, kolega wyżej zauważył problem, z tagami <a>, chce tylko je.


Wyrażenia regularne wałkuję od pewnego czasu...

Próbuję taki kod (do zmiany url-a oraz zakodowaniu go do base 64)

  1. $content='<a href="test.php">test</a>';
  2. $new_content = preg_replace('!(<a\s*[^>]*)href="([^"]+)"!','\1 href="site.php?url=\2'.base64_encode('\2').'"', $content);
  3.  
  4. print($new_content);



Niestety... do base64 kodowany jest string \2 a nie jego zawartość :/ ( wiem oczywiście że to nie działa, ale tak jak u góry, wygląda po prostu lepiej wizualnie dla pokazania problemu).

Nie wiem jak potraktować ten \2, może to jakaś tablica tylko jak ją wywołać jeżeli nie mamy tego w zmiennej, bo przecież nie jako new_content[2] sad.gif
redeemer
Nie doczytałem dokładnie za pierwszym razem sad.gif

Z tym base64_encode() to nie ma prawa zadziałać w preg_replace, gdyż najpierw wykonywany jest właśnie base64_encode() i łączenie stringów, a dopiero na końcu parsowany jest $replacement w preg_replace.

Musisz użyć preg_replace_callback().

Tu masz przykład użycia właśnie z base64_encode(): http://www.sitepoint.com/forums/showthread.php?t=528218
ahold
Witaj kolego,

Link który podałeś jest doskonałym przykładem!.

Właśnie delikatnie go zmodyfikowałem ale nie chce działać.

Pokazuję działający (ale nie do końca) przykład:

Dane wejściowe:

  1. $string='
  2.  
  3. <a href="test.php">test</a>
  4. <br>
  5. <a id="test" alt="xxx" href="http://onet.pl">onet.pl</a>
  6. <br>
  7. <a id="test" href="http://wp.pl" alt="xxx" >wp.pl</a>
  8.  
  9.  
  10. ';
  11. //$new_content = preg_replace('!(<a\s*[^>]*)href="([^"]+)"!','\1 href="site.php?url=\2'.base64_encode('\2').'"', $content);
  12. $string=preg_replace_callback('/(?<=<a href=")(.*?")/', create_function('$m', 'return "http://www.mysite.com/parse.php?url=".base64_encode(rtrim($m[1],"\""))."\"";'), $string);
  13. print($string);



Dane wyjściowe:
  1. <a href="http://www.mysite.com/parse.php?url=dGVzdC5waHA=">test</a>
  2. <br>
  3. <a id="test" alt="xxx" href="http://onet.pl">onet.pl</a>
  4. <br>
  5. <a id="test" href="http://wp.pl" alt="xxx" >wp.pl</a>
  6.  



Wykonało działanie, tylko i wyłącznie te, które zawiera tag <a href=", jeżeli jest w innym miejscu nie działa (co jest oczywiście zrozumiałe).

Podmieniam więc na coś takiego:

  1. $string=preg_replace_callback('/(?<=<a*href=")(.*?")/', create_function('$m', 'return "http://www.mysite.com/parse.php?url=".base64_encode(rtrim($m[1],"\""))."\"";'), $string);
  2. print($string);


(wstawiam gwiazdkę jako dowolny ciąg znaków między <a dowolny ciag znakow href=">

Niestety kończy się błędem składni...


Czy jest dopuszczalne wstawienie tam dowolnego ciągu znaków, czy jednak nie sad.gif
phpion
Dowolny znak to nie "*" tylko ".". Dowolna liczba wystąpień dowolnego znaku to .*
ahold
Teraz całkowita klapa:

Input
  1. $string='
  2.  
  3. <a href="test.php">test</a>
  4. <br>
  5. <a id="test" alt="xxx" href="http://onet.pl">onet.pl</a>
  6. <br>
  7. <a id="test" href="http://wp.pl" alt="xxx" >wp.pl</a>
  8.  
  9.  
  10. ';
  11. //$new_content = preg_replace('!(<a\s*[^>]*)href="([^"]+)"!','\1 href="site.php?url=\2'.base64_encode('\2').'"', $content);
  12. $string=preg_replace_callback('/(?<=<)(a.*)(href=")(.*?")/', create_function('$m', 'return "http://www.mysite.com/parse.php?url=".base64_encode(rtrim($m[1],"\""))."\"";'), $string);
  13. print($string);


Output:


  1. <http://www.mysite.com/parse.php?url=YSA=">test</a>
  2. <br>
  3. <http://www.mysite.com/parse.php?url=YSBpZD0idGVzdCIgYWx0PSJ4eHgiIA==">onet.pl</a>
  4. <br>
  5. <http://www.mysite.com/parse.php?url=YSBpZD0idGVzdCIg" alt="xxx" >wp.pl</a>



Zastanawiam się, czy praser mnie nie lubi, czy po prostu robię coś źle sad.gif

paw-e-l
strasznie namieszałeś haha.gif

Cytat
/(?<=<)(a.*)(href=")(.*?")/


w nawiasy () dajesz tylko element który ma zostać 'wyciągnięty' i poddany torturom przez funkcje którą wywołujesz później winksmiley.jpg
ahold
Szeryfie, twój kod niestety również nie działa.

Idąc tropem tortur w nawiasach okrągłych zmieniłem na kwadratowe:

  1. $string=preg_replace_callback('/(?<=<a)[.*](href=")(.*?")/', create_function('$m', 'return "http://www.mysite.com/parse.php?url=".base64_encode(rtrim($m[1],"\""))."\"";'), $string);



Output niestety wygląda smutno:
  1. <a href="test.php">test</a>
  2. <br>
  3. <a id="test" alt="xxx" href="http://onet.pl">onet.pl</a>
  4. <br>
  5. <a id="test" href="http://wp.pl" alt="xxx" >wp.pl</a>


Nic w nim nie zmieniło sad.gif
paw-e-l
ja tylko zacytowałem Twoje wyrażenie a nie podałem swojego winksmiley.jpg
zaraz spróbuję to szkorbnąć tak jak powinno być i edytuje tego posta

Kod
/\<a.*href="([a-z0-9:\/\.]+)"/i


nie bij jeśli nie będzie działać bo wyrażenia regularne nie są moją mocną stroną
ahold
Użyłem takiego kodu:

  1. $test = preg_replace('/(?<=\bhref=")([^"]+)(?=")/e', 'base64_encode("$1");', $test);
  2. echo $test;



Powyższe przykłady, wykonuje super, tylko że jako gratis, działa również na href znajdujące się w innych nie "a" tagach...

Czy mógł by tu ktoś dopisać, do tego co jest powyżej definicję <a i reszta jak jest ?

redeemer
Spróbój tak:

  1. preg_replace('/(\<a)(.*)href=\"[A-Za-z0-9\.\%]*\"/i', '$1'.'$2'.'href="NOWA_WARTOSC"', $code);




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.