#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» означает «Нет совпадения»!!!