Как проверить, что в имени файла есть только A-Z 0-9 a-z — _ и пробел?

#php #regex

#php #регулярное выражение

Вопрос:

Я хочу ограничить файл буквенно-цифровым только с разрешенным пробелом.

Я пробовал:

 if (!preg_match('/[^_A-Za-z0-9 -.]/', $file['name'])) { //do something }

if (preg_match("/[^_A-Za-z0-9 -.]/", $file['name']) !== true) { //do something }

if (preg_match("/[^_A-Za-z0-9 -.]/", $file['name']) !== false) { //do something }

if (preg_match("/^[_A-Za-z0-9 -.]/", $file['name']) !== false) { //do something }

if (preg_match("/^[_A-Za-z0-9 -.]/", $file['name']) !== true) { //do something }

if (preg_match('/^[-A-Za-z0-9._] $/i', $file['name']) !== true) { //do somethin }
  

В первом примере:

test.jpg это принято.

testä.jpg это тоже принято, но так не должно быть.

Во втором примере:

test.jpg не принимается, но должно быть.

testä.jpg не принимается.

Ответ №1:

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

 ^[A-Za-z0-9_ -] .[a-zA-Z0-9_] $
  

Запустите шаблон с помощью якоря, чтобы подтвердить начало строки ^ (если вы используете его внутри класса символов в начале [^ , вы отрицаете класс символов и утверждаете конец строки $

Если вы только хотите знать, было ли совпадение для имени файла, содержащего символы, которых не должно быть, вы можете использовать:

 ^[w.-] $
  

Демонстрация регулярных выражений | Демонстрация Php

Например, используйте preg_match и отрицайте его, если хотите знать, что оно не соответствует.

Ваш код может выглядеть так:

 if (!preg_match('/^[w.-] $/i', $filename)) {
  

Обратите внимание на возвращаемые значения preg_match:

preg_match() возвращает 1, если шаблон соответствует заданной теме, 0, если это не так, или FALSE, если произошла ошибка.

Комментарии:

1. я попробовал ваше разрешение, но если я использую === не работает.

2. Вам не нужно использовать === true или false, потому что возвращаемое значение preg_match равно 0 или 1

3. Я не знаю почему, но это работает: if (preg_match(‘/^[-A-Za-z0-9._] $/i’, $file[‘name’]) == false) { // }

4. Интересно, в руководстве по PHP сказано: Предупреждение Эта функция может возвращать логическое значение FALSE, но также может возвращать не логическое значение, которое оценивается как FALSE. Пожалуйста, прочитайте раздел о логических значениях для получения дополнительной информации. Используйте оператор === для проверки возвращаемого значения этой функции.

5. @McMannehan Если вы удалите === часть и используете инструкцию if, проверяющую положительный сценарий, вы могли бы сработать. Я не думаю, что предыдущая строка из комментариев работает. Смотрите 3v4l.org/pLVVg

Ответ №2:

Спасибо всем за быструю помощь. Это:

 if (preg_match('/^[-A-Za-z0-9._] $/i', $file['name']) == false) { //do error output }
  

работает отлично. Только — _ . a-z A-Z 0-9 принимается в строке.

Да, я уверен. «Демо» неверно. Демонстрация должна быть такой:

 $file = ["name" => "test.jpg"];
if (preg_match('/^[-A-Za-z0-9._] $/i', $file['name']) == false) {
  echo "No Match!";
} else {
echo "match!";
}
  

preg_match выдает «FALSE», поэтому ответом должно быть «Нет совпадения»!!!

И кто дал «минус» моему ответу: -(сначала проверьте демонстрацию перед «минусом».

Комментарии:

1. боже, конечно!!! Посмотрите демонстрацию. проверка preg_match на «FALSE»!!! Что еще я должен сказать!!! Ответ «FALSE» означает «Нет совпадения»!!!