[PHP] preg_replace -> "pattern" i style

0

Mam pytanie czy może mi ktoś wyjaśnić co robi jaki znak w tym (chodzi mi o "pattern" )
preg_replace('/{([^}]+)}/e', '$this->dane["\\1"]',$this->tmpl);

Jak użyje tego powyżej to mi w kawałku ze stylami wykopuje style :/
czyli jak mam:
A { font-size: 12px } zmienia mi na A czyli obcina wszystko co w stylu :/

nigdy nie używałem tej funkcji a w manualu nie moge ni w ząb zrozumieć jak napisać żeby mi tylko czytało i zamieniało znaczniki m-n "[...]" ,a nie m-n "{...}"

0

Wyrażenia Regularne (Regular Expression)

'/{([^}]+)}/e' oznacza:
krancowe '' to string w php, wiec olac
potem mamy // na poczatku i prawie na koncu - to ogranicznik (moze byc prawie dowolny w PHP, / to standard) dla wyrazenia regularnego
'e' na koncu oznacza, ze drugi parametr funkcji preg_replace to nie string ale cos, co zostanie wykonane

i dochodzimy do samego wyrazenia, czyli {([^}]+)}
oznacza to tyle, co:

  1. { -> znajdz znak '{'
  2. () -> zlap do backreference \1 ciag wewnatrz [wykorzystany w 2 parametrze preg_replace]
  3. [^}] -> dowolny znak procz '}'
    • -> 1 lub wiecej razy
  4. } -> znajdz znak '}'

czyli to cos szuka ciagu: "{COKOLWIEK}" i "COKOLWIEK" przechodzi do \1 ktore uzywamy w 2 parametrze, o tu: $this->dane["TU"]

Jesli chcesz szukac "[COKOLWIEK]" czyli nawiasy [] zamiast {} to napisz:

preg_replace('/\[([^}]+)\]/e', '$this->dane["\\1"]',$this->tmpl);

Nie jestem pewien, ale koncowe "]" moze byc chyba po prostu jako "]" ale tak jak jest tez jest ok.

0
Marooned napisał(a)

Wyrażenia Regularne (Regular Expression)

Jesli chcesz szukac "[COKOLWIEK]" czyli nawiasy [] zamiast {} to napisz:

preg_replace('/\[([^}]+)\]/e', '$this->dane["\\1"]',$this->tmpl);

Nie jestem pewien, ale koncowe "]" moze byc chyba po prostu jako "]" ale tak jak jest tez jest ok.

Dzięki pomogłeś baaardzo :) i thx za linka (nie zauważyłam jakoś wczoraj wieczorem...)
Jakoś napisałęm takie coś: " /[([^]]+)]/e "
I z tego mi wychodzi:
"/" i "/e" początek i koniec - ok (e to to że w drugim partametrze f. musi zostać wykonane coś tam)
[ - czyli znajdź znak otwierający "[" (bo samo "[" oznacza przedział) -ok
( i ) - to jest iż to co w środku może się pojawić ile tam chce w szukanej części (po "[" i przed "]") - ok?
[^]] - uwzględnij wszystkie znaki prócz "]" jeśli to się pojawi zaniecha zamiany - ok?

    • oznacza że to "]" nie może się pojawić się chociaż raz jak sie pojawi to nic nie zmienia i idze dalej - ok?
      ] - znak zamykający - ok

CZy dobrze to wyłapałem?? Jak się myle to mogę prosić o poprawę :)

0

@SAPER: dokładnie tak :)

0

Ups, napisalem [}] - oczywiscie dobrze zmieniles na []] :)

AklimX - nie dokladnie tak :P
Bledna interpertacja tych punktow:

( i ) - to jest iż to co w środku może się pojawić ile tam chce w szukanej części (po "[" i przed "]") - ok?
[^]] - uwzględnij wszystkie znaki prócz "]" jeśli to się pojawi zaniecha zamiany - ok?

    • oznacza że to "]" nie może się pojawić się chociaż raz jak sie pojawi to nic nie zmienia i idze dalej - ok?
      () to tak zwane backreference, to co zostanie dopasowane wewnatrz nawiasow bedzie mozna uzyc w czesci do zastapienia.
      Przyklad (kropka to jeden dowolny znak)
      mamy ciag: "12345" i RegExp: /.(.).(.)./
      RegExp zostanie dopasowany do ciagu, bo ma on 5 znakow, natomiast do pierwszego backreference [czyli \1] leci "2" a do drugiego "4". Dzieki temu Jesli napiszemy:
preg_replace('/.(.).(.)./', '\1 - \2', '12345');

to otrzymamy ciag "2 - 4"
Chyba juz jasne :)

co do []] to nic sie nie zaniecha. Jesli mamy ciag "ab[cd]ef" to []] dopasuje sie do "a", bo "a" to nie "]". Jesli natomiast dodamy plusik za tym, czyli [^]]+ to RegExp bedzie szukal przynajmniej jednego znaku roznego od "]" ale bedzie sie staral znalezc jak najwiecej, czyli dopasuje ciag "ab[cd" i takie cos zwroci, gdyz nie ma dluzszego ciagu pasujacego, bo nastepny znak to "]".
Gdyby ciag byl "[a]" to dopasowany fragment bylby "[a" natomiast jesli ciag bylby "]" to RegExp nic by nie dopasowalo, bo + oznacza, ze musi byc conajmniej 1 pasujacy znak.

Polecam przeczytac artykul :) [oraz komentarze]

0

a [^]] nie jest szukanie znaków różnych od niczego, a po tym "]" (chodzi mi że nie powinien być backslash przed "]" - znaczy nie wiem bo nie próbowałem a nie chce mi się teraz patrzeć ;P

0

Jesli ']' jest jako pierwszy znak w klasie (lub negacji klasy) to nie jest uznawany jako znak specjalny, czyli prawidlowe wersje:
[]] ale juz [a]]
[]] ale juz [a]]

Podobnie jest z myslnikiem, ktory to jest znakiem specjalnym w klasie, jednak traktowany jest jako zwykly znak jesli wystepuje jako pierwszy lub ostatni, czyli:
[-], [-abc], [-a-z], [123-] ale juz [a-z-0-9]
tak samo: [-abc] ale [ab-c]

Natomiast znaki specjalne poza klasa, typu +.? nie maja specjalnego znaczenia wewnatrz klasy, wiec pisanie takich kwiatkow: [a-z*+.] nie jest bledem ale niepotrzebnie zaciemnia regexp, bo to samo otrzymamy piszac: [a-z+.]

Pozdro :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1