Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] regexp i przepisywanie ciągów
Forum PHP.pl > Forum > Przedszkole
uncuncunc
Czasami w skryptach widzę tablice z "aliasami" które są wyciągane przez preg_match i przypisywane do zmiennej np.

Cytat
$sprawdany_string = 'bbbaaa/21'
array('/[a-z]+\/:id/');



Zastanawiam się jak zrobić, aby sprawdzić czy ciąg pasuje do wyrażenia i aby skrypt wiedział że :id to w tym wypadku 21 i że jest to liczba czyli zakres [0-9]+ oraz aby to przypisać do jakiejś zmiennej.

Wiem jak zamienić :id na [0-9]+ to nie problem i wtedy sprawdzam czy pasuje, ale jak konkretny :id przypisać wartość ze sprawdzanego ciągu?



Tak kombinuje... zamiana :id na [0-9]+ to

  1. preg_repalce('/:id/','[0-9]+',$str);


Później sprawdzam czy $str pasuje do wyrażenia przez preg_match, jednak wcześniej chciałbym do jakiejs zmiennej przepisać wartość tego :id ... jak? np. $id = 21;

Może explode i porównywanie do tablicy? Czy PHP ma w sobie jakieś aliasy dla wyrażeń? A ja szukam nie pod tą nazwą.
bostaf
Jeśli dobrze rozumiem pytanie, to funkcją której szukasz jest preg_match, wywołana z trzecim argumentem. Pamiętaj, żeby odpowiednio skonstruować wyrażenie regularne - używaj nawiasów okrągłych do grupowania podciągów, które potem przechwytywane są do trzeciego parametru funkcji preg_match.
uncuncunc
Tak wiem np.
  1. preg_match('/(:id)/',$str,$match);


Pobierze mi :id w tablice... ALE jak teraz sprawdzić czy pod :id kryje się odpowiednie wyrażenie [0-9]+ i jest nim 21 z podanego ciągu który musi się zgadzać?

To ma wyglądać tak:

  1. $str = '/blog/21'
  2. $reg = '/blog/:id/';
  3. preg_match($reg, $str)


czyli skrypt ma to widzieć jak

  1. $str = '/blog/21'
  2. $reg = '/blog/[0-9]+/';
  3. preg_match($reg, $str)


Chodzi o to aby nie pisać w wyrażeniu [0-9]+ tylko :id, taki alias, zamiennik.
bostaf
Można przekazać tą wartość po prostu z jakiejś zmiennej PHP:
  1. $id = 21;
  2.  
  3. $str = '/blog/21'
  4. $reg = '/blog/' . $id . '/';
  5. preg_match($reg, $str)

Tylko, że wtedy to jest zwykłe porównywanie łańcuchów i nie warto używać funkcji z wyrażeniami regularnymi. Jeśli chcesz sprawdzić czy w danym łańcuchu występuje konkretna wartość (inny konkretny łańcuch) to wystarczy strpos albo inna podobna funkcja albo, w skrajnym przypadku zwykłe porównanie:

  1. $id = 21;
  2. $str = '/blog/21';
  3. $reg = '/blog/' . $id;
  4. $takie_same = $str == $reg; // TRUE jeśli takie same, FALSE jeśli nie
  5. var_dump($takie_same);


Hmmm, nie jestem pewien czy nie za bardzo chcesz przekombinować. 21 (czy jakakolwiek inna liczba) to zawsze "[0-9]+" i sprawdzanie najpierw czy łańcuch spełnia wzorzec "[0-9]+" a potem czy to jest jakaś konkretna liczba jest zbędnym przetwarzaniem. Prościej od razu sprawdzić czy łańcuch zawiera daną liczbę i - dla pewności - czy jest ona w konkretnym miejscu (np.: na końcu danego łańcucha).
!*!
http://pl1.php.net/preg_match#example-4791

Przypisz do :id wartość [0-9]+ zamień to poźniej w wyrażeniu przez preg_repalce na (?P<id>[0-9]+) i takie gotowe wyrażenie przepuść przez preg_match.
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.