Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyrażenia regularne
Forum PHP.pl > Forum > Przedszkole
slightyboy
Dużo czytałem o wyrażeniach regularnych, ale jakoś nadal nie mogę się z nimi uporać... Może ktoś pomóc? Na dobrą sprawę nie mam pojęcia co robię źle. Może poprostu źle rozumiem używane przeze mnie funkcje. Problem jest taki:

Konstruuje skrypt, który modyfikuje na własne potrzeby dodawane do bazy linki. Jeśli chodzi o instrukcje warunkowe to działają one jak należy. Problem tkwi w podmianie w funkcji ergi_replace. Gdy definicja target znajduje się na końcu skrypt podmienia dobrze, gdy owa definicja znajduje się gdzieś po środku, czy na początku (gdy nie kończy stringa) wszystko się sypie. Sypie znaczy się, że skrypt kasuje wszystko co znajduje się po podmienionym fragmencie:

  1. <?php
  2. // Link w takiej formie modifikuje się dobrze
  3. $link = "<a href="odno&#347;nik" title="tytuł" target="frame">";
  4. // Link w takiej formie NIE MODYFIKUJE się dobrze
  5. $link = "<a href="odno&#347;nik" target="frame" title="tytuł">";
  6.  
  7. // Funkcja modyfikujący linki
  8. if (ereg(".+target=".+".+", $link)) { // gdy link zawiera już definicję 'targetu'
  9. $link = eregi_replace("target=".+"", "target="_blank"", $link);}
  10. else{ // gdy link nie zawiera definicji 'targetu'
  11. $link = str_replace(">", " target="_blank">", $link);}
  12. ?>


PS. Jeśli chodzi o składnię i cały wklejony przeze mnie kod to jest on w 100% dobry, brak literówek, czy jakichkolwiek innych braków (choćby znaków), jedyny jego mankament to najprawdopodobniej zła kombinacja wyrażenia regularnego. Niestety nie umiem się uporać z tym sam. biggrin.gif
yaotzin
Nie mam jak tego sprawdzić, ale nie wiem czy ten + nie powinien stąd zniknąć...


  1. <?php
  2. eregi_replace("target=".+"", "target="_blank"", $link);
  3. ?>
slightyboy
Niestety nie działa... Nie wiem już sam co robić. Wydaje mi się, że jest ok, a tu jednak ucina zaraz po tym znaczniku 'target'. :/

Próbowałem także inaczej z zastowosowaniem tablic. Sposób ten również nie działa, niewiedzieć czemu zupełnie (exclamation.gif!). Coś się uwzięło na mnie...

  1. <?php
  2. $string = "<a title="asd" name="asd" target="bla bla" href="erwer">";
  3. $string = str_replace("=", "", $string);
  4.  
  5. $tab = explode(""", $string);
  6.  
  7. /*
  8. Tablica powstająca w wyniku explode:
  9.  
  10. $tab[0] => '<a title'
  11. $tab[1] => 'asd'
  12. $tab[2] => 'name'
  13. $tab[3] => 'asd'
  14. $tab[4] => 'target'
  15. $tab[5] => 'bla bla'
  16. $tab[6] => 'href'
  17. $tab[7] => 'erwer'
  18. $tab[8] => '>'
  19.  
  20. */
  21.  
  22. // przeszukiwanie tablicy w celu znalezienia 'target' (NIE ZWRACA ŻADNEJ LICZBY, choć powinna (!!!))
  23. $id = (array_search("target", $tab)); 
  24. // dodawanie 1 by odnaleźć wartość znacznika 'target'
  25. $rid - $id + 1; 
  26. // zastąpienie wartość 'target' własną wartością
  27. $string = str_replace($tab[$rid], "mojeee", $string);
  28. ?>
Wiem, że brak tu funkcji 'sklejającej' link, ale to kwestia dosłownie paru minut. Nie wiem już sam co zrobić, bo i tamten sposób nie działa i ten też nie (choć oba powinny działa [nie jestem pewien co do wyrażeń regularnych, ale co do tego sposobu tak!])... Ma ktoś jakąś propozycję... Ja już się chyba poddaje innego sposobu nie znam (oprócz ręcznej zamiany)... sadsmiley02.gif

PS. Funkcja array_search() tak jakby wybierała sobie co chce znaleźć a co nie... Np. frazy 'asd', 'erwer', '<a title' znajduje... Nie wiem w czym robię błąd, bo ja go szczerze nie widzę...
Kicok
Co do array_search to pod $tab[4] nie masz 'target', tylko ' target' (zwróć uwagę na spację)


A co do wyrażeń regularnych, to .+ dopasuje ci tak dużo znaków jak to tylko możliwe, ale żeby wyrażenie nadal pasowało, czyli target=".+" dopasuje ci:
Cytat
<a href="abc.html" target="_self" class="link">abc</a>


Możesz zamienić to na .+? (które dopasuje ci jak najmniej znaków, ale żeby wyrażenie nadal pasowało), lub [^"]+ (które nie dopasuje żadnego cudzysłowu).
target=".+?":
Cytat
<a href="abc.html" target="_self" class="link">abc</a>
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.