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

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

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

 

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

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

тема: PHP регулярное выражение для проверки многострочного текста
 
 автор: danga   (02.03.2014 в 19:17)   письмо автору
 
 

Здравствуйте, форумчане. Помогите пожалуйста составить регулярное выражение. Задача простая: пользовтель отпраляет письмо через форму обратной связи. Сам тескт письма $letter передается через форму и изначально вводится в поле textarea. В письме допускаются только латинские буквы, цифры и знаки пунктуации, скобки и кавычки. Не могу добиться проверки многострочного текста.

if (!preg_match("/([A-Za-z0-9:;,!'\s*\-\.\?\()\"]+)/m", $letter)) или

if (!preg_match("/([A-Za-z0-9:;,!'\s*\-\.\?\()\"]+)/", $letter))

- не проверяет и пропускает любые недозволенные символы, например @ & #

if (!preg_match("/^([A-Za-z0-9:;,!'\s*\-\.\?\()\"]+)$/m", $letter))

- недозволенные символы не пропускает, но и не пропускает многострочное письмо, если там есть строки заполненные не полностью, например заголовки или перечисления в столбик

Кто-то сталкивался с такой задачей?
Заранее благодарна
Danga

  Ответить  
 
 автор: duhon   (03.03.2014 в 13:24)   письмо автору
 
   для: danga   (02.03.2014 в 19:17)
 

без примера входящего текста и неверного результата, сама проблема до конца не ясна.
приведу некоторые примеры, возможно они ответят на все вопросы.

<?php 
$allowed_symbols 
'[a-z0-9:;,!\'\s*.?()"-]';
echo (int)!
preg_match("/$allowed_symbols/im"'@3'); //0 проверка отсуствия разрешенных символов
echo (int)!preg_match("/^$allowed_symbols+$/i""aaa\nb@bb\nccc"); //1 присуствуют недопустимые символы во всем тексте
echo (int)!preg_match("/^$allowed_symbols+$/i""a@aa\nbbb\nccc"); //1 присуствуют недопустимые символы во всем тексте
echo (int)!preg_match("/^$allowed_symbols+$/im""aaa\nb@bb\nccc"); //0 есть строка полностью из допустимых символов (aaa)
echo (int)!preg_match("/^$allowed_symbols+$/im""a@aa\nbbb\nccc"); //0 есть строка полностью из допустимых символов (bbb)
echo (int)!preg_match_all("/^$allowed_symbols+$/i""aaa\nb@bb\nccc"$match); //1 во всем тексте есть недопусимые символы
echo (int)!preg_match_all("/^$allowed_symbols+$/im""aaa\nb@bb\nccc"$match); //0 есть строки полностью из допустимых символов (aaa,ccc)
echo preg_replace("/^$allowed_symbols+$/i"'<$0>' "aaa\nb@bb\nccc"1); //покажет что находит 2 пункт (1)
echo preg_replace("/^$allowed_symbols+$/im"'<$0>' "aaa\nb@bb\nccc"1); //покажет что находит 4 пункт (0)
echo '---лучше так проверять присуствие недопустимых символов--';
$not_allowed_symbols '[^a-z0-9:;,!\'\s*.?()"-]';
echo (int)
preg_match("/$not_allowed_symbols/i""aaa\nb@bb\nccc"); //1
echo (int)preg_match("/$not_allowed_symbols/i""aaa\nbbb\nccc"); //0

(int) я использовал что бы echo могла вывести false, а то пустота не очень наглядный пример

универсальный помощник
<?php
echo preg_replace($regex'<$0>' $text1); //покажет что находит preg_match
echo preg_replace($regex'<$0>' $text); //покажет что находит preg_match_all

  Ответить  
 
 автор: danga   (03.03.2014 в 15:37)   письмо автору
 
   для: duhon   (03.03.2014 в 13:24)
 

Добрый день,
что-то я совсем запуталась с этой проверкой. Сделала маленькую тестовую программу, ввожу любой текст письма, например:
" Hello,
I would like to know more about your services"
выдает мое сообщение, как будто в тексте недозволенные символы :

"There are not allowed symbols in the text";
Что не правильно?

<?php
$not_allowed_symbols 
'[^a-z0-9:;,!\'\s*.?()"-]';
echo 
'
<form action="test.php" method="post">
<textarea name="letter" autofocus maxlength="1200" cols="80" rows="15" ></textarea>
<input type="submit" name="OK"  value="send" >
</form> '
;
if (isset(
$_POST['OK'])) {
$letter nl2br($_POST["letter"]);
IF (
preg_match("/$not_allowed_symbols/i"$letter)) echo "There are not allowed symbols in the text";
}
?>

  Ответить  
 
 автор: duhon   (03.03.2014 в 16:08)   письмо автору
 
   для: danga   (03.03.2014 в 15:37)
 

все дело в nl2br
<?php
$letter 
nl2br("aaa\nbbb\nccc"); 
print_r($letter);

результат будет
aaa<br />\nbbb<br />\nccc

а теперь сравниваем это [^a-z0-9:;,!\'\s*.?()"-]
<?php
echo preg_replace('/[^a-z0-9:;,!\'\s*.?()"-]/i''{$0}' nl2br("aaa\nbbb\nccc"), 1); //aaa{<}br />\nbbb<br />\nccc

тоесть регулярка сказала что символ < недозволенный символ

Выход, сначала проверить наличие неразрешенных символов, а потом уже применять функцию nl2br

З.Ы. вообще вас занесло нетуда, обратите внимание хотя бы на http://www.php.net/manual/ru/book.filter.php

  Ответить  
 
 автор: danga   (03.03.2014 в 18:02)   письмо автору
 
   для: duhon   (03.03.2014 в 16:08)
 

Ураа! Все получается теперь.
Duhon, спасибо преогромное!
Это самый лучший форум и здесь самые умные и вежливые форумчане!

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

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