[PHP]Regex nie sprawdza całego ciągu |
[PHP]Regex nie sprawdza całego ciągu |
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.
Pytajniki to placeholdery dla liczb. I teraz kod sprawdzający. Najpierw wybrane znaki zamieniam na te rozumiane przez regEx. Potem tworzę już gotowego RegExa.
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ę. |
|
|
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
Ten post edytował kapslokk 24.07.2018, 16:23:08 |
|
|
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.
|
|
|
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%) |
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.
|
|
|
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 |
|
|
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+`
|
|
|
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. |
|
|
Wersja Lo-Fi | Aktualny czas: 27.04.2024 - 17:28 |