Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg_replace
Forum PHP.pl > Forum > PHP
Athlan
Witam,

ostatnio piszę system wymiany linków kontekstowych i natknąłem się na pewien problem. Aby nie wdrażać całego systemu postanowiłem napisać mały przykładzik:

  1. <?php
  2. echo preg_replace(array('/test/', '/sample/'), array('replaced_test sample', 'replaced_sample'), 'test');
  3. ?>


Oczekiwany wynik: replaced_test sample
Wynik który powstaje: replaced_test replaced_sample

Wniosek? preg_replace zamienia również patterny, które są zamiennikami dla patternów, które mają być zamienione.

Jak uniknąć sytuacji, aby to, co jest zamiennikiem juzzostało na zawsze, bez zamieniania?

Problem dość ciekawy, czekam na sugestie smile.gif

Pozdrawiam, Athlan
starach
Wydaje mi się że w takim wypadku jedynym rozwiązaniem jest ustalanie odpowiedniej kolejności.
Kicok
Jeśli argumentami funkcji preg_replace" title="Zobacz w manualu PHP" target="_manual są tablice, to dla każdej pary elementów tych tablic preg_replace() wykonywane jest oddzielnie (tak jakby preg_replace() umieścić w pętli)

Żeby to obejść trzeba:
1. Znaleźć jakiś identyfikator który nie występuje ani w szukanym ani w zamienianym tekście, np: 'b3fwe0saf32f'
2. Dodać ten identyfikator do szukanych danych:
Kod
'To jest test a dobre sample można znaleźć na ...' => 'To jest test:b3fwe0saf32f a dobre sample:b3fwe0saf32f można znaleźć na ...'

3. Zamieniać dane z identyfikatorami tą twoją funkcją preg_replace
Athlan
@Kicok: tutaj zrobiłem przykład zamianiania wartosci, nie kluczy z identyfikatorem, i nie jest to najlpeszy sposób. Poza tym to co powiedziałeś nie idzie w dobrym kieunku, gdyż wyrazy w tekście nie posiadają takiego identyfikatora. Tekst jest najzwyklejszy w świecie...

  1. <?php
  2. $sId = ':ad65gn435sd4v';
  3. $a1 = array('/test/', '/sample/');
  4. $a2 = array('replaced_test sample', 'replaced_sample' . $sId);
  5. ?>


@Kicok: ale natchnąłeś mnię do innego pomysłu:

ażda zamieniana fraza obięta by była w jakieś znaki, dla przykladu i wyłącznie przykładu dajmy znaki procenta: %

  1. <?php
  2. $a1 = array('/test/', '/sample/');
  3. $a2 = array('%replaced_test sample%', '%replaced_sample%');
  4. ?>


Po co to? A no po to, że string wewnątrz % i % NIE JEST brany pod uwagę zamiany. Gorzej z ułożeniem do tego odpowiedniego prega. Zna ktoś odpowiedź, jak wykluczyć string między % i % ?

Ogolnie sposób dobry smile.gif

Pozdrawiam, Athlan






--- EDIT ---

Znaleziono rozwiązanie... wystarczy mieć matcha: /(wyraz|wyraz|wyraz)/e zamieniane na: $a2[\\1]
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.