Помогите с Regex, используя preg_match

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

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

Привет, мир

Я хочу, чтобы preg_match проверял приведенную выше строку «hello world», строка содержит пробелы.

Но я хочу, чтобы он проверялся, даже если нет пробела «helloWorld» или просто «hello».

Что я пытаюсь сделать, так это то, что в моем скрипте у меня есть текстовое поле для заголовка категории, я хочу, чтобы оно принимало в нем пробелы и никаких других специальных символов (таких как ._-+*,).

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

preg_match('/^[a-zA-Z0-9\s]*$/', $cat_name);'

Любая помощь будет оценена по достоинству.


person Zubair1    schedule 20.08.2010    source источник


Ответы (4)


Выглядит нормально, но будет принимать пустую строку, поэтому вы можете изменить * на + Помните, что это регулярное выражение, вероятно, не будет принимать символы UTF-8, указанные в языке.

См. этот комментарий в руководстве: http://www.php.net/manual/en/function.preg-match.php#95828

Также обратите внимание, что в заголовках очень часто используются некоторые специфические символы, например, «и, возможно, было бы лучше разрешить это.

person Piotr Müller    schedule 20.08.2010
comment
+1, потому что я также написал это в своем обновлении своего ответа, но я думаю, что вы были на 2 секунды быстрее. :) - person Mark Byers; 20.08.2010
comment
Спасибо Killer_PL и Марку Байерсу :) На самом деле я проверял непустое условие для этого над этой проверкой регулярного выражения. - person Zubair1; 20.08.2010
comment
лол, я не знаю, как размещать код в комментариях здесь :) он выглядит испорченным. - person Zubair1; 20.08.2010
comment
У меня есть условие if/else, если пусто elseif str_len elseif preg_match все операторы if выдают пользователю другую ошибку. - person Zubair1; 20.08.2010

Да, это правильный путь. Вы также можете использовать модификатор без учета регистра вместо a-zA-Z:

preg_match('/^[a-z0-9\s]*$/i', $cat_name);'

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

person Mark Byers    schedule 20.08.2010

Должно работать, но вы можете заменить \s обычным пробелом " ", чтобы он соответствовал только пробелам, а не другим пробельным символам (например, табуляциям). Также замените * на +, чтобы он не принимал пустые строки.

preg_match('/^[a-z0-9 ]+$/i', $cat_name);'
person Powertieke    schedule 20.08.2010
comment
Спасибо, Готово :) Было бы все еще угрозой, если бы я проверял пустую строку перед этим preg_match? я все еще делаю это на всякий случай, но было интересно :) - person Zubair1; 20.08.2010
comment
Вам не нужно этого делать, но вы можете использовать разные проверки для возврата разных сообщений об ошибках. Может быть удобно, чтобы сказать пользователю, что именно он делает неправильно :) - person Powertieke; 20.08.2010

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

person André Hoffmann    schedule 20.08.2010
comment
что еще я мог бы использовать, кроме \s? - person Zubair1; 20.08.2010
comment
просто используйте вместо этого пробел: (без скобок) - person André Hoffmann; 20.08.2010
comment
Вместо этого используйте простой пробел (' ')... который будет работать только для пробелов, а не для других пробелов. - person Frxstrem; 20.08.2010