PDA

Pogčedajte punu verziju : Kako se matchuju parovi?


bluesman
10. 09. 2007., 15:01
Imam regexp koji treba da pronadje u tekstu sve parove nesto i zameni za <a href=''>nesto</a>:

Pattern izgleda ovako:

"\(.+)?\[\/c\]"

Kada unesem tekst sa jednim onda je sve ok, cim ih ima vise od 1 on nadje prvi i poslednji i zameni sve izmedju. znaci za ovaj teksto:

Proba jedan i jos dva kraj

Zameni sve od prvog do zadnjeg za link, a treba mi po parovima, znaci on zameni ovako:

Proba <a href=''>jedan i jos [c]dva</a> kraj

a treba mi:

Proba <a href=''>jedan</a> i jos <a href=''>dva</a> kraj.

Da li ja nesto ne kapiram dobro kako u stvari funksionise eregi ?

Blood
10. 09. 2007., 15:15
Ne znam za eregi, nikad ga nisam koristio, ali preko preg_replace bi islo ovako:

$string = 'Proba jedan i jos dva kraj';

$pattern = '{\[c\](.*?)\[\/c\]}';
$rep = '<a href="">${1}</a>';

echo preg_replace($pattern,$rep,$string);

dinke
10. 09. 2007., 15:37
preg* f-je su uz to i brze, tako da generalno uvek preporucujem njihovo koriscenje, tim pre sto podrzavaju posix subset (tj. mozes koristiti istu sintaksu kao i kod ereg* f-ja).

Inace, poenta je staviti (.*?) kao sto je napisao blood. Po defaultu kod regexpa match je "greedy" tj. pokusava da pronadje najveci moguci match. U tvom slucaju pokupi sve izmedju prvog i poslednjeg (ukljucujuci i ko zna koliko istih unutra). Ovaj '?' u ovom slucaju pak to iskljucuje, tj. onda hvata prvi moguci match i ne trazi dalje.

bluesman
10. 09. 2007., 16:01
preg* f-je su uz to i brze, tako da generalno uvek preporucujem njihovo koriscenje, tim pre sto podrzavaju posix subset (tj. mozes koristiti istu sintaksu kao i kod ereg* f-ja).


Prvo znam, ali mi je sintaksa bila teze razumljiva, zato sam uvek koristio ereg... ali si mi sada dao kljucnu informaciju - ako mogu da koriste istu sintaksu kao ereg... onda sam resio sve probleme. Hvala.

dinke
10. 09. 2007., 19:54
Potpuno isto, jedino sto kod preg* f-ja koristis delimiter (recimo "/") na pocetku i kraju regexp stringa. Primer:

ereg:
ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)

preg_match:
preg_match ("/([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})/", $date, $regs)

robi-bobi
10. 09. 2007., 20:36
ja uglavnom stavljam U modifier posle drugog delimitera, za resenje greedy problema, koji resava problem globalno a ne na nivou jednog item-a. ionako meni skoro nikad ne treba greedy match
http://bg.php.net/manual/en/reference.pcre.pattern.modifiers.php