Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Шаблон \s
 
 автор: SilentChild   (15.03.2012 в 16:11)   письмо автору
 
 

Здравствуйте, уважаемые программисты && программистки!

Есть код:

<?php
if (!empty($_POST['ok'])) {
    
$message_user htmlspecialchars($_POST['message_user']);
    
    if (
ereg("^\s*$"$message_user)) {
        echo(
"Заполните поле.");
    }
}
?>
<form action="./index.php" method="post">
  <textarea name="message_user"></textarea>
  <input type="submit" name="ok" value="ok">
</form>


Я ввожу в поле textarea много Enter`ов и отправляю форму.

Вопрос: почему не выводится сообщение "Заполните поле." ? Как мне известно, шаблон \s в регулярных выражениях обозначает любой пробельный символ, в том числе и символ новой строки \n, который я ввожу в textarea нажатием Enter. В чём я ошибся?

А вот такой вариант работает:

if (ereg("^[ \t\r\n]*$", $message_user)) {

  Ответить  
 
 автор: Sfinks   (15.03.2012 в 23:38)   письмо автору
 
   для: SilentChild   (15.03.2012 в 16:11)
 

вот не знаю что конкретно по вопросу ответить, вроде должно работать, но есть 2 НО!

1.
Внимание
С версии PHP 5.3.0 эта функция считается УСТАРЕВШЕЙ. Крайне не рекомендуется полагаться на эту возможность.

2. А не проще написать
$message_user = trim($_POST['message_user']);
и проверить функцией empty()? И понятнее и быстрее.

  Ответить  
 
 автор: SilentChild   (16.03.2012 в 13:22)   письмо автору
 
   для: Sfinks   (15.03.2012 в 23:38)
 

1. У меня версия PHP 5.3.5. Благодарю за подсказку! Значит \d, \D, \w, \W тоже устарели в этой версии? Или только \s и \S?
2. Т.е. функция empty() вернёт TRUE, если переменная $message_user будет состоять из одних символов перевода строки, пробелов, символов возврата каретки, символов табуляции, пустой строки, 0, "0", FALSE, NULL, array(), так? Я правильно понял?
3. Ещё одно: функцию empty() нельзя употреблять в таком виде


empty(trim($message_user));


...но в таком можно?


$message_user = trim($message_user);
empty($message_user);


Т.е. нельзя в функцию empty() пихать другую функцию, которая делает что-то с переменной, так? Но по отдельности можно?

  Ответить  
 
 автор: Sfinks   (16.03.2012 в 19:40)   письмо автору
 
   для: SilentChild   (16.03.2012 в 13:22)
 

> У меня версия PHP 5.3.5. Благодарю за подсказку! Значит \d, \D, \w, \W тоже устарели в этой
версии? Или только \s и \S?

Устарели не \d, \D, \w, \W, \s, \S и т.д., а ereg() и другие POSIX Regex Функции. Вместо них рекомендуется использовать preg_match() и тому подобные функции (PCRE/Perl-совместимые).

> Т.е. функция empty() вернёт TRUE, если переменная $message_user будет состоять из одних
символов перевода строки, пробелов, символов возврата каретки, символов табуляции, пустой
строки, 0, "0", FALSE, NULL, array(), так?

Нет. empty() вернет тру если переменная будет пустой, нулевой, неопределенной или null. А функция trim() удаляет пробельные символы из начала и конца строки. Пробельными считаются пробел, \t, \n, \r, \0, \x0B.
Т.е. в вашем случае после trim() строка будет пустой и empty() вернет true.

> Т.е. нельзя в функцию empty() пихать другую функцию, которая делает что-то с переменной,
так? Но по отдельности можно?

Именно так.

  Ответить  
 
 автор: SilentChild   (16.03.2012 в 20:46)   письмо автору
 
   для: Sfinks   (16.03.2012 в 19:40)
 

Благодарю Вас за исчерпывающий ответ! =)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования