Перейти к содержимому

Фото
- - - - -

Не могу понять preg_match


  • Вы не можете создать новую тему
  • Please log in to reply
6 ответов в этой теме

#1 XTerm

XTerm
  • Пользователь
  • 127 сообщений

Отправлено 16 декабря 2009 - 13:59

Добрый день.

Я запутался в конец. Надо смастерить валидацию данных. Я в php не тум-тум, но почитав, я накатал такой скриптик.

Проблема в том, что мне надо true, если $post_name пустое или имеет символы кроме A-Z, А-я или 0-9 (в идеале еще пробел надо приплести).

По идее, как я понял, функция
preg_match("[^A-zА-я0-9]", $post_name)
должна давать true если найден символ не входящий в подстроку. Но не работает.

Где я накосячил?

if ( empty($post_name) or preg_match("[^A-zА-я0-9]", $post_name) )
	{
		echo "Ne verno";
	}
	else
	{
		echo "Verno";
	}

  • 0
Quidquid latine dictum sit, altum sonatur.

#2 Alexano

Alexano
  • Пользователь
  • 109 сообщений

Отправлено 16 декабря 2009 - 16:05

(!preg_match('/^[A-zА-я0-9\s]+$/', $post_name)
  • 0

#3 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 16 декабря 2009 - 20:38

(!preg_match('/^[A-zА-я0-9\s]+$/', $post_name)

правда может возникнуть проблема с utf-8. Тогда надо будет указать модификатор u
(!preg_match('/^[A-zА-я0-9\s]+$/u', $post_name)

  • 0

#4 XTerm

XTerm
  • Пользователь
  • 127 сообщений

Отправлено 16 декабря 2009 - 23:00

Спасибо!
А можно так:

ereg("[^A-zА-я0-9 ]", $post_name)

?
  • 0
Quidquid latine dictum sit, altum sonatur.

#5 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 16 декабря 2009 - 23:55

XTerm, ereg

This function has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged.

можно, но не нужно. Всё равно она не учитывает UTF-8

if ( empty($post_name) or preg_match('/[^A-zА-я0-9]/u', $post_name) )

этот вариант тоже должен работать. если не работает, то сделай такой тест

$variants = array( 'varian1', 'вариант2', '()2349' );

foreach ( $variants as $variant )
{
echo "Proverka '{$variant}': ";
echo ( empty($variant ) or preg_match('/[^A-zА-я0-9]/u', $variant )  ) ? 'OK' : 'ERROR';
echo '<br/>';
}

и определись наконец, в какой кодировке у тебя текст
  • 0

#6 XTerm

XTerm
  • Пользователь
  • 127 сообщений

Отправлено 18 декабря 2009 - 12:14

О! Заработало.

Спасибо всем. :)
  • 0
Quidquid latine dictum sit, altum sonatur.

#7 Gangblang

Gangblang
  • Пользователь
  • 203 сообщений

Отправлено 04 февраля 2010 - 15:05

Спасибо!
А можно так:

ereg("[^A-zА-я0-9 ]", $post_name)

?



ЗЫ: функции класса ereg(eregi(),ereg_replace(),ereg_xxxxx), не учитывают NULL-BYTE.Используй preg функции(preg_match(),preg_replace() ).Желательно не использовать,даже если не принимаешь данные от юзера)

правда может возникнуть проблема с utf-8. Тогда надо будет указать модификатор u


Класс,а я всё думал,что делать с русскими буквами :)(ибо парсеры умирали,приходилось принудительно кодировать строку)
  • 0