Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenia regularne - niedziałające odwołania
Forum PHP.pl > Forum > PHP
Capellini
Czy mógłby ktoś spojrzeć na poniższe wyrażenie?

  1. preg_match("/<(.*)>(.*)<\/\1>/", "Ten tekst jest odwrocony: <odwroc>fdgd</odwroc>", $matches);


Po wykonaniu tej instrukcji, $matches jest pustą tablicą, a wynik powinien być taki:

  1. $matches[0] == "<odwroc>fdgd</odwroc>"
  2. $matches[1] == "odwroc"
  3. $matches[2] == "fdgd"


Zauważyłem, że problem jest w odwołaniu \1 bo gdy \1 zastąpię słowem 'odwroc', to wszystko działa jak należy. Nadal nie wiem, co konkretniej jest nie tak.
Ellington
Uzyj

preg_match_all
wookieb
Cytat(Ellington @ 8.08.2009, 13:43:03 ) *


Nawet nie wiesz, że to nic nie zmienia. Więc jak coś radzisz to sprawdź a nie bredzisz.

Co do tematu to \1 (i podobne) można stosować w takich funkcjach jak pre g_replace a nie pre g_match i pre g_match_all. wiec twoje wyrazenie powinno wygladac mniej wiecej tak
  1. preg_match("/<(.*?)>(.*?)<(.*?)>/", "Ten tekst jest odwrocony: <odwroc>fdgd</odwroc>", $matches);
m44
Jeśli chcesz stosować odwołania wsteczne w podwójnym cudzysłowie, to musisz poprzedzić jedynkę jeszcze jednym "\", tak:

Kod
preg_match("/<(.*)>(.*)<\/\\1>/", "Ten tekst jest odwrocony: <odwroc>fdgd</odwroc>", $matches);
Capellini
Teraz mam problem z innym wyrażeniem:

Kod
<.*?/\s*>


Czyli na przykład dla:

Kod
<a><b /></a>


Pasującym ciągiem powinno być
Kod
<b />
, a znajduje
Kod
<a><b />


To drugie też pasuje, ale specjalnie dałem po * znak zapytania, żeby dopasowywało leniwie więc powinno zwracać to pierwsze.
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.