2015-08-25 7 views
1

Итак, я знаю, что мне понадобится регулярное выражение для этого, и использовать preg_match().Убедитесь, что строка содержит только цифры, буквы и символы подчеркивания с помощью PHP?

documentation for preg_match() говорит, что функция вернет либо false, либо false-ish, если смещение длиннее длины строки. Я интерпретировал документацию как означающую, что она вернет false, если совпадений нет.

Я ужасен с регулярными выражениями, но после прочтения о них on this site Я попытался написать функцию, которая сделала то, что мне было нужно. Он не работает.

У меня есть следующий фрагмент кода:

if (preg_match('/^[a-zA-Z0-9_]+/', $requested_table_name) === false) { 
     echo "Invalid String"; 
    } else { 
     echo "You're golden, Ponyboy"; 
    } 

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

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

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

+1

Использование якоря: '/^[a-zA-Z0-9 _] + $ /' – anubhava

+0

Просто используйте '\ w +', '^ \ w + $' (с привязками для проверки полной строки). '\ w' - буквенно-цифровые символы и символы подчеркивания. http://www.regular-expressions.info/shorthand.html '\ w означает« символ слова ». Он всегда соответствует символам ASCII [A-Za-z0-9_] ' – chris85

+0

@anubhava Это тоже не работает. – Allenph

ответ

1

Вы находитесь на правильном пути с регулярным выражением. Вы пытаетесь удалить любые нежелательные символы, поэтому просмотрите preg_replace.

Некоторые комментарии упоминают сокращения, такие как \w, соответствующие одной букве, номеру или подчеркиванию. Также есть \W (столица), которая соответствует любому одиночному символу, который не является буквой, числом или подчеркиванием.

Это будет делать то, что вы хотите: $sanitized_input = preg_replace("/\W/", "", $input);

Или, без использования стенографии, обратите внимание ^, что сводит на нет символы в [class]: $sanitized_input = preg_replace("/[^a-zA-Z0-9_]/", "", $input);

Не забудьте проверить, что preg_replace возвращается является то, что вы хотите (т. е. проверить на null на сбои).

1

Ваши косые черты - разделители. ^ действительно говорит start of string. [a-zA-Z0-9_]+ перечисляет символы, которые вы хотите разрешить, один или несколько раз. Однако после этого один или несколько раз вы разрешаете что-либо, например. A! будет действителен, так как он начинается с A. Если вы привяжете это выражение, вы убедитесь, что разрешены только те символы.

=== false неверен, так как возвращается 0, или 1, а не false.

Demo (некорректной проверки, но не отвечает):

<?php 
$string = 'asdf2341234_'; 
$return = preg_match('/^[a-zA-Z0-9_]+$/', $string); 
if ($return === false){ 
    echo 'is false'; 
} else { 
    echo 'not false'; 
} 
var_dump($return); 

Так что ваш регулярное выражение должно быть ...

if (!preg_match('/^\w+$/', $string)) { 
    echo "Invalid String" . $string . "\n"; 
} else { 
    echo "You're golden, Ponyboy" . $string . "\n"; 
} 

или ...

if (!preg_match('/^[a-zA-Z0-9_]+$/', $string)) { 
    echo "Invalid String" . $string . "\n"; 
} else { 
    echo "You're golden, Ponyboy" . $string . "\n"; 
} 

или ...

if (!preg_match('/^[a-z\d_]+$/i', $string)) { 
    echo "Invalid String" . $string . "\n"; 
} else { 
    echo "You're golden, Ponyboy" . $string . "\n"; 
} 

Вы можете проверить regexs на regex101.com. Он дает объяснение всему, что вы вводите.

Смежные вопросы