Wyrażenie regularne dla liter, cyfr i - _


105

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.


^ [\ w .-] * $ -> Spowoduje to pobranie wszystkich nazw plików.
Badri Gs

Odpowiedzi:


216

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 \wzamiast tego. To jest klasa znaków dla „znaku słowa”.

Dokumentacja API


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.


Zobacz także ideone.com/5DMCa, aby uzyskać inną specyfikację, która może być bardziej pożądana . Poruszaj się ze mną w tę iz powrotem na rubular, jeśli chcesz ze mną opracować specyfikację.
polygenelubricants

Używam Tornado i muszę przechwytywać nazwy html, więc użyłem tego na podstawie Twojej odpowiedzi; ^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon

Dodałbym kolejną regułę, która brzmi: ostatni znak powinien być alfanumeryczny. Zaktualizowano Regex:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Consta Gorgan

Użytkownicy Go (golang), uwaga, wzorzec w tym miejscu spowoduje falsepuste literały ciągów. Plac zabaw . Użyj rozwiązania @ nonopolarity poniżej .
BentCoder

16

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.


3
Umieść -pierwszą w zestawie, aby uniknąć definiowania zakresu. I \wpokrowce alfanumeryczne i podkreślenia. Więc potrzebujesz [\w.-]+.
Richard

Dzięki, to działa dobrze dla mnie: ^ [\ w \ d _.-] + \. (Csv | CSV) $
Dharam Mali,

Jest to również zgodne z pustymi, nieprzetworzonymi literałami Go (golang), podczas gdy zaakceptowana odpowiedź nie, więc użytkownicy Go trzymają się tego rozwiązania. Plac zabaw
BentCoder

8

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ą.

7

To jest wzór, którego szukasz

/^[\w-_.]*$/

Co to znaczy:

  • ^ Początek ciągu
  • [...] Dopasuj znaki w środku
  • \w Dowolny znak słowa tak 0-9 a-z A-Z
  • -_.Dopasuj -i _i.
  • * Zero lub więcej wzoru lub nieograniczone
  • $ Koniec łańcucha

Jeśli chcesz ograniczyć liczbę znaków:

/^[\w-_.]{0,5}$/

{0,5}Znaczy 0-5znaki


var a = / ^ \ w * $ / g a.test ("46545") i wynik był fałszywy
Dipak,

1
Zauważ, że \wobejmuje to_
Galaxy

4

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”


2

[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+

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.