Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Podmiana frazy przez preg_replace() z pominięciem
Forum PHP.pl > Forum > PHP
caroon
Witam,
za pomocą wyrażeń regularnych i funkcji preg_replace(), muszę dokonać podmiany frazy A w zmiennej tekstowej, nie podmieniając tej samej frazy A występującej pomiędzy dwoma różnymi znacznikami.

Przykład - słowo 'dlugi' trzeba zamienić na 'krotki' nie zamieniając słowa pomiędzy znacznikami 11 i 22. Dodatkowa trudnoscią jest fakt, że w rzeczywistości, pomiędzy znacznikami może znaleźć się wszystko, z kodem w php, perlu itp. włącznie.

$string1 = "To jest jakis dlugi 11 dlugi 22 tekst";
$string2 = preg_replace('//', '', $string1);


Jak zapisać wyrażenie regularne dla $string2 w preg_replace() ? Może coś

Będę wdzięczny za wskazówki
qba_rox
  1. <?php
  2. $s1 = "To jest jakis dlugi 11 dlugi 22 tekst";
  3. $s2 = preg_replace('|(.*)dlugi(.*)(11.*22.*)|', '${1}krotki${2}${3}', $s1);
  4. ?>


przerabne, bo to dziala tylko jesli masz jedno wystapienie 'dlugi' przed 11. jak chcesz to obejsc, to zrob petle ktora trwa do momentu az przedostatnia zamiana rowna sie ostatniej zamianie (czyli nic nie zmienilismy). jest to nie wydajne na maksa, ale jest pozno wiec tylko to mi przyszlo do glowy smile.gif
grubyx
Witaj, zrobiłem to bez uzycia funkcji preg_replace, ale nie wiem czy o takie coś dokładnie Tobie chodzi i czy moja wersja się w tym sprawdzi, oto kod:
  1. <?
  2. $string1 = "To jest jakis dlugi 11 dlugi 22 tekst";
  3.  
  4. $s = '11 dlugi 22';
  5. $r = '!@@@!';
  6.  
  7. $string2 = str_replace($s, $r, $string1);
  8.  
  9. $s3 = str_replace('dlugi', 'krotki', $string2);
  10.  
  11. echo str_replace($r, $s, $s3);
  12.  
  13. ?>

Po prostu zamienia '11 dlugi 22' na ciąg znaków '!@@@!' i potem wszystkie wystąpienia słowa 'dlugi' na 'krotki' i w efekcie zwraca poprawny string. Tylko, gdy w tekście znajdzie się coś o wartości takiej samej jak string $r to zostanie to zamienione na słowo 'długi'. Jeśli będziesz miał pewność, że taki ciąg znaków nie wystąpi powinno działać, jeśli nie to możesz najpierw z całego tekstu usunąć ciąg '!@@@!' (bo w sumie nietypowy i brzydko wyglądający na stronie) albo zamienić go np na '!!!!!', pokombinuj smile.gif.
Pozdrawiam.
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.