Mam problem ze sprawdzeniem w PHP, czy wartość jest jedną z następujących kombinacji
- litery (duże lub małe)
- cyfry (0–9)
- podkreślenie (_)
- myślnik (-)
- punkt (.)
- bez odstępów! lub inne postacie
kilka przykładów:
- OK: „screen123.css”
- OK: „screen-new-file.css”
- OK: „screen_new.js”
- NIE OK: „screen new file.css”
Myślę, że potrzebuję do tego wyrażenia regularnego, ponieważ muszę zgłosić błąd, gdy dany łańcuch zawiera inne znaki niż te wymienione powyżej.
Odpowiedzi:
Wzór, który chcesz, jest podobny ( zobacz go na rubular.com ):
^[a-zA-Z0-9_.-]*$
Wyjaśnienie:
^
jest początkiem kotwicy linii$
jest końcem kotwicy linii[...]
to definicja klasy znaków*
to „zero lub więcej” powtórzeńZauważ, że dosłowny myślnik
-
jest ostatnim znakiem w definicji klasy znaków, w przeciwnym razie ma inne znaczenie (np. Zakres). Ma.
również inne znaczenie poza definicjami klas znaków, ale w środku jest po prostu literałem.
Bibliografia
W PHP
Oto fragment pokazujący, jak możesz użyć tego wzorca:
<?php $arr = array( 'screen123.css', 'screen-new-file.css', 'screen_new.js', 'screen new file.css' ); foreach ($arr as $s) { if (preg_match('/^[\w.-]*$/', $s)) { print "$s is a match\n"; } else { print "$s is NO match!!!\n"; }; } ?>
Powyższe wydruki ( widoczne na ideone.com ):
screen123.css is a match screen-new-file.css is a match screen_new.js is a match screen new file.css is NO match!!!
Zauważ, że wzór jest nieco inny, używając
\w
zamiast tego. To jest klasa znaków dla „znaku słowa”.Dokumentacja API
preg_match
Uwaga dotycząca specyfikacji
Wydaje się, że jest to zgodne z twoją specyfikacją, ale pamiętaj, że będzie pasować do rzeczy, takich jak
.....
itp., Które mogą być takie, jak chcesz. Jeśli możesz bardziej precyzyjnie określić, jaki wzorzec chcesz dopasować, wyrażenie regularne będzie nieco bardziej skomplikowane.Powyższe wyrażenie regularne również pasuje do pustego ciągu. Jeśli potrzebujesz co najmniej jednego znaku, użyj
+
(jeden lub więcej) zamiast*
(zero lub więcej) do powtórzenia.W każdym razie możesz dokładniej wyjaśnić swoją specyfikację (zawsze pomaga przy zadawaniu pytania regex), ale miejmy nadzieję, że możesz również nauczyć się pisać wzór samodzielnie, biorąc pod uwagę powyższe informacje.
źródło
^/([a-zA-Z0-9._-]*\.html)$
/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
false
puste literały ciągów. Plac zabaw . Użyj rozwiązania @ nonopolarity poniżej .możesz użyć
^[\w\d_.-]+$
+
jest upewnienie się, że ma co najmniej 1 znak. Potrzebujesz^
i,$
aby oznaczyć początek i koniec, w przeciwnym razie, jeśli ciąg ma dopasowanie w środku, na przykład@@@@xyz%%%%
, to nadal jest dopasowanie.źródło
-
pierwszą w zestawie, aby uniknąć definiowania zakresu. I\w
pokrowce alfanumeryczne i podkreślenia. Więc potrzebujesz[\w.-]+
.Myślę, że aby faktycznie pokryć swój wzorzec, tj. Prawidłowe nazwy plików zgodnie z Twoimi zasadami, potrzebujesz trochę więcej. Zauważ, że to nie pasuje do legalnych nazw plików z perspektywy systemu . Byłoby to zależne od systemu i bardziej liberalne w tym, co akceptuje. Ma to na celu dopasowanie akceptowanych wzorców.
^([a-zA-Z0-9]+[_-])*[a-zA-Z0-9]+\.[a-zA-Z0-9]+$
Wyjaśnienie:
^
Dopasuj początek łańcucha. To (plus dopasowanie końca) wymusza zgodność ciągu z dokładnym wyrażeniem, a nie tylko zawiera podłańcuch pasujący do wyrażenia.([a-zA-Z0-9]+[_-])*
Zero lub więcej wystąpień jednej lub więcej liter lub cyfr, po których następuje podkreślenie lub myślnik. Powoduje to, że wszystkie nazwy zawierające myślnik lub podkreślenie mają między sobą litery lub cyfry.[a-zA-Z0-9]+
Jedna lub więcej liter lub cyfr. Dotyczy to wszystkich nazw, które nie zawierają podkreślenia ani myślnika.\.
Dosłowny kropka (kropka). Wymusza, aby nazwa pliku miała rozszerzenie i, poprzez wykluczenie z reszty wzorca, zezwalała tylko na użycie kropki między nazwą a rozszerzeniem. Jeśli potrzebujesz więcej niż jednego rozszerzenia, które można również obsłużyć przy użyciu tej samej techniki, co w przypadku myślnika / podkreślenia, tylko na końcu.[a-zA-Z0-9]+
Jedna lub więcej liter lub cyfr. Rozszerzenie musi mieć co najmniej jeden znak i może zawierać tylko litery i cyfry. Jest to typowe, ale jeśli chcesz zezwolić na podkreślenia, możesz również rozwiązać ten problem. Możesz także podać zakres długości{2,3}
zamiast jednego lub więcej+
dopasowań, jeśli to było bardziej odpowiednie.$
Dopasuj koniec łańcucha. Zobacz postać początkową.źródło
To jest wzór, którego szukasz
/^[\w-_.]*$/
Co to znaczy:
^
Początek ciągu[...]
Dopasuj znaki w środku\w
Dowolny znak słowa tak0-9
a-z
A-Z
-_.
Dopasuj-
i_
i.
*
Zero lub więcej wzoru lub nieograniczone$
Koniec łańcuchaJeśli chcesz ograniczyć liczbę znaków:
/^[\w-_.]{0,5}$/
{0,5}
Znaczy0-5
znakiźródło
\w
obejmuje to_
Coś takiego powinno działać
$code = "screen new file.css"; if (!preg_match("/^[-_a-zA-Z0-9.]+$/", $code)) { echo "not valid"; }
To powtórzy „nieprawidłowy”
źródło
[A-Za-z0-9_.-]*
Będzie to również pasowało do pustych ciągów, jeśli nie chcesz, aby ta zamiana ostatniego
*
na+
źródło