Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] regexp i przepisywanie ciągów
uncuncunc
post
Post #1





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 1.04.2012

Ostrzeżenie: (0%)
-----


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ą.
Go to the top of the page
+Quote Post
bostaf
post
Post #2





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
uncuncunc
post
Post #3





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 1.04.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
bostaf
post
Post #4





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
!*!
post
Post #5





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 19:56