Регулярное выражение для букв, цифр и - _


106

У меня проблемы с проверкой в ​​PHP, если значение является одной из следующих комбинаций

  • буквы (прописные или строчные)
  • числа (0-9)
  • нижнее подчеркивание (_)
  • тире (-)
  • точка (.)
  • без пробелов! или другие персонажи

несколько примеров:

  • ОК: "screen123.css"
  • ОК: "screen-new-file.css"
  • ОК: "screen_new.js"
  • НЕ ОК: "экран новый файл.css"

Думаю, для этого мне нужно регулярное выражение, так как мне нужно выдать ошибку, когда в заданной строке есть другие символы, кроме упомянутых выше.


^ [\ w .-] * $ -> Это получит все имя файла.
Badri Gs

Ответы:


216

Шаблон, который вам нужен, выглядит примерно так ( см. Его на rubular.com ):

^[a-zA-Z0-9_.-]*$

Пояснение:

  • ^ это начало строки привязки
  • $ конец строки привязки
  • [...] определение класса символов
  • * повторение "ноль или более"

Обратите внимание, что буквальное тире -является последним символом в определении класса символов, иначе оно имеет другое значение (например, диапазон). В.Также имеет различные определения классов смысл за пределами характер, но внутри, это просто буквальный.

Ссылки


В PHP

Вот отрывок, показывающий, как можно использовать этот шаблон:

<?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";
  };
}

?>

Приведенные выше отпечатки ( как видно на 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!!!

Обратите внимание, что узор немного отличается, \wвместо него используется . Это класс символов для "словесных символов".

Ссылки API


Примечание по спецификации

Кажется, это соответствует вашей спецификации, но обратите внимание, что это будет соответствовать таким вещам, как ..... и т. Д., Которые могут или не могут быть тем, что вы хотите. Если вы можете более точно указать, какой шаблон вы хотите сопоставить, регулярное выражение будет немного сложнее.

Вышеупомянутое регулярное выражение также соответствует пустой строке. Если вам нужен хотя бы один символ, используйте +(один или несколько) вместо *(ноль или более) для повторения.

В любом случае вы можете дополнительно уточнить свою спецификацию (всегда помогает при задании вопроса о регулярном выражении), но, надеюсь, вы также можете научиться писать шаблон самостоятельно, учитывая приведенную выше информацию.


См. Также ideone.com/5DMCa, чтобы узнать о других спецификациях, которые могут быть больше того, что вам нужно. Если вы хотите разработать вместе со мной спецификацию, ходите со мной туда и обратно по рублярам.
polygenelubricants

Я использую Tornado, и мне нужно захватить имена html, поэтому я использовал это на основе вашего ответа; ^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon

Я бы добавил еще одно правило: последний символ должен быть буквенно-цифровым. Обновленное /[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Конста Горган

Пользователи go (golang), обратите внимание, шаблон здесь приведет falseк пустым необработанным строковым литералам. Детская площадка . Используйте решение @ nonopolarity ниже .
BentCoder

16

ты можешь использовать

^[\w\d_.-]+$

+чтобы убедиться , что он имеет , по крайней мере , 1 символ. Нужны ^и $для обозначения начала и конца, иначе, если строка имеет совпадение в середине, например, @@@@xyz%%%%тогда это все равно совпадение.


3
Поместите -первый в набор, чтобы не определять диапазон. И \wохватывает буквенно-цифровые символы и подчеркивание. Так что вам нужно [\w.-]+.
Ричард

Спасибо, у меня это прекрасно работает: ^ [\ w \ d _.-] + \. (Csv | CSV) $
Дхарам Мали

Это также соответствует пустым необработанным строковым литералам Go (golang), тогда как принятый ответ не соответствует этому, поэтому пользователи Go придерживаются этого решения. Игровая площадка
BentCoder

8

Чтобы на самом деле охватить ваш шаблон, то есть допустимые имена файлов в соответствии с вашими правилами, я думаю, вам нужно немного больше. Обратите внимание, что это не соответствует допустимым именам файлов с точки зрения системы . Это будет зависеть от системы и будет более либеральным в том, что она принимает. Это предназначено для соответствия вашим приемлемым шаблонам.

^([a-zA-Z0-9]+[_-])*[a-zA-Z0-9]+\.[a-zA-Z0-9]+$

Пояснение:

  • ^Соответствует началу строки. Это (плюс конечное совпадение) заставляет строку соответствовать точному выражению, а не просто содержать подстроку, соответствующую выражению.
  • ([a-zA-Z0-9]+[_-])*Ноль или несколько вхождений одной или нескольких букв или цифр, за которыми следует подчеркивание или тире. В результате все имена, содержащие дефис или подчеркивание, будут содержать буквы или цифры между ними.
  • [a-zA-Z0-9]+Одна или несколько букв или цифр. Это касается всех имен, не содержащих подчеркивания или дефиса.
  • \.Буквальная точка (точка). Заставляет имя файла иметь расширение и, исключая из остальной части шаблона, разрешает использовать только точку между именем и расширением. Если вы хотите, чтобы несколько расширений можно было обработать, используя ту же технику, что и для тире / подчеркивания, только в конце.
  • [a-zA-Z0-9]+Одна или несколько букв или цифр. Расширение должно состоять минимум из одного символа и содержать только буквы и цифры. Это типично, но если вы хотите разрешить подчеркивание, это тоже можно решить. Вы также можете указать диапазон длины {2,3}вместо одного или нескольких +сопоставителей, если это более уместно.
  • $Сопоставьте конец строки. См. Начальный символ.

7

Это шаблон, который вы ищете

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

Что это значит:

  • ^ Начало строки
  • [...] Подбирайте символы внутри
  • \w Любой словесный символ так 0-9 a-z A-Z
  • -_.Матч -и _и.
  • * Ноль или более шаблонов или неограниченное количество
  • $ Конец строки

Если вы хотите ограничить количество символов:

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

{0,5}Означает 0-5персонажей


var a = / ^ \ w * $ / g a.test ("46545"), и результат был ложным
Дипак

1
Уведомление, которое \wвключает_
Galaxy

4

Что-то вроде этого должно работать

$code = "screen new file.css";
if (!preg_match("/^[-_a-zA-Z0-9.]+$/", $code))
{
    echo "not valid";
}

Это будет эхом "недействительно"


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.