регулярное выражение для букв, цифр и - _ - PullRequest
78 голосов
/ 12 июня 2010

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

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

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

  • ОК: "screen123.css"
  • OK: "screen-new-file.css"
  • OK: "screen_new.js"
  • НЕ ОК: "screen new file.css"

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

Ответы [ 6 ]

154 голосов
/ 12 июня 2010

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

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

Объяснение:

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

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

Ссылки


В PHP

Вот фрагмент кода, чтобы показать, как вы можете использовать этоpattern:

<?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


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

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

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

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

11 голосов
/ 12 июня 2010

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

^[\w\d_.-]+$

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

7 голосов
/ 12 июня 2010

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

^([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} вместо одного или нескольких + сопоставителей, если это более уместно.
  • $ Соответствует концу строки.Смотрите начальный символ.
4 голосов
/ 13 января 2018

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

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

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

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

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

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

{0,5} Значения 0-5 символов

4 голосов
/ 12 июня 2010

Как то так должно работать

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

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

1 голос
/ 12 июня 2010

[A-Za-z0-9_.-]*

Это также будет соответствовать пустым строкам, если вы не хотите, чтобы последние обменивали * на +

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...