Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Regex nie sprawdza całego ciągu
piekarz
post 24.07.2018, 16:13:56
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 23.08.2011

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


Witam.

Mam taki oto problem że regex zwraca "true" gdy podany string w części pasuje do innego wzorca. A powinno być tak że pod uwagę jest brany string tylko jako całość.

Przykład:
Mam trzy wzorce do których następuje sprawdzanie. Te wzorce to wzorce akceptowalnych adresów url.
  1.  
  2. $patterns = [
  3. 'users',
  4. 'users/?,
  5. 'users/?/level/?'
  6. ]
  7.  


Pytajniki to placeholdery dla liczb.

I teraz kod sprawdzający.

Najpierw wybrane znaki zamieniam na te rozumiane przez regEx.
Potem tworzę już gotowego RegExa.
  1. foreach ($patterns as $patt){
  2.  
  3. $urlReg = str_replace(['/','?'],['\/','.*'],$patt);
  4.  
  5. $regEx = "/^$urlReg$/i";
  6.  
  7. echo preg_match($regEx, $inputUrl);
  8. }


I teraz najważniejsze:

Dla urla 'users' zwraca mi true dla pierwszego wzoru. POPRAWNIE
Dla urla typu 'users/4' zwraca mi true dla drugiego wzoru. POPRAWNIE
Dla urla typu 'users/4/level/1' zwarca mi true dla drugiego i trzeciego wzoru. ŹLE Powinno zwrócić true tylko dla trzeciego wzoru.

Co jest nie tak? Dlaczego zwraca mi dwa razy true?
A po drugie dlaczego nie zwraca true dla trzech wzorów? Chyba tak powinno byś jeśli regEx nie działa poprawnie?
I po trzecie, dlaczego dla przypadku drugiego urla nie zwracami true dla dwóch pierwszych wzorów?

Bardzo proszę o pomoc co jest źle i jak to naprawić.

Z góry dziękuję.
Go to the top of the page
+Quote Post
kapslokk
post 24.07.2018, 16:22:56
Post #2





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


Pytajnik zamieniasz na .*, czyli na "cokolwiek", wstaw tam np. "cokolwiek tylko nie slash" i bedzie ok tongue.gif

Ten post edytował kapslokk 24.07.2018, 16:23:08
Go to the top of the page
+Quote Post
piekarz
post 24.07.2018, 16:37:52
Post #3





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 23.08.2011

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


Nie bardzo rozumiem. Co mam tam wstawić w takim wypadku aby mi akceptowało w tym miejscu dowolny ciąg liczb lub liter? Myślałem że ".*" właśnie za to odpowiada.
Go to the top of the page
+Quote Post
b4rt3kk
post 24.07.2018, 16:42:53
Post #4





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


Cytat(piekarz @ 24.07.2018, 17:13:56 ) *
Dla urla typu 'users/4/level/1' zwarca mi true dla drugiego i trzeciego wzoru. ŹLE Powinno zwrócić true tylko dla trzeciego wzoru.


. reprezentuje dowolny znak nie będący nową linią, tabulacją, itd., więc zalicza się do tego również /.

Do patternu users/.* pasuje wszystko co zaczyna się users/, czyli również users/4/level/1.

Jeśli rozdzielasz poszczególne części ciągu znakiem / to proponuję wykluczyć go z wyszukiwania lub jeśli mają tam być tylko litery i cyfry to zastosować np. taki pattern:

users/[0-9a-zA-Z]*/level/[0-9a-zA-Z]*



Ten post edytował b4rt3kk 24.07.2018, 16:45:12


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
piekarz
post 24.07.2018, 16:48:20
Post #5





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 23.08.2011

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


Ahha to teraz to jasne. Dzięki Wam obojgu za pomoc.

Pozdrawiam
Go to the top of the page
+Quote Post
Pyton_000
post 24.07.2018, 16:53:54
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


skoro `?` to liczba to zamień to na `\d+`
Go to the top of the page
+Quote Post
piekarz
post 24.07.2018, 17:11:11
Post #7





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 23.08.2011

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


Na razie to liczba, ale nie jest powiedziane że to się nie zmieni więc wolę mieć też możliwość obsługi tekstu.
Ale dzięki za info.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2024 - 17:52