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

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

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

 

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

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

тема: Обработка идущих подряд одинаковых знаков и цифр
 
 автор: Владимир55   (03.07.2011 в 21:14)   письмо автору
 
 

С помощью вот этого выражения
$text = preg_replace('#((.)\2{2,1000})#', ' ', $text);

удаляются четыре и более идущих подряд одинаковых знаков.

Как на основе его (или без него) установить переменную $error = 'yes", если выполняется хотя бы одно из условий:

1. в переменной $text имеются четыре и более одинаковых знака, идущие подряд, и эти знаки не являются цифрами;

2. в переменной $text имеется целое число, содержащее более более 12 цифр;

3. в переменной $text имеется слово, длиннее 20 знаков.

  Ответить  
 
 автор: cheops   (03.07.2011 в 21:16)   письмо автору
 
   для: Владимир55   (03.07.2011 в 21:14)
 

А можно увидеть содержимое переменной $text или её фрагмента (с участком, о котором идет речь)?

  Ответить  
 
 автор: Владимир55   (03.07.2011 в 21:33)   письмо автору
 
   для: cheops   (03.07.2011 в 21:16)
 

Иногда люди забивают форму всякой дрянью. Например:
==========ВВВВВВВВВВВБольшая Советская Энциклопедия (БСЭ) содержит огромное количество информации по всем областям человеческих знаний.
 5555555555555555555555555555555 От-искусства-и-культуры_до_науки_и_техники.
 Огромноеколичествостатейпосвященобио графиямвидныхсоветскихииностранныхд еятелей 

Если такая информация имеется в переменной $text , то ее надо идентифицировать как ошибочную. Тут есть и лишенные смысла выражения, и забивание поля одинаковыми цифрами, и слова без пробелов.

А вот если введен текст типа:
1000000 статей устарели. 

то здесь одинаковые цифры не являются ошибкой.

  Ответить  
 
 автор: cheops   (03.07.2011 в 21:47)   письмо автору
 
   для: Владимир55   (03.07.2011 в 21:14)
 

Выражение должно быть одно или под разные задачи можно использовать разные выражения?

  Ответить  
 
 автор: Владимир55   (03.07.2011 в 21:50)   письмо автору
 
   для: cheops   (03.07.2011 в 21:47)
 

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

if (Выражение 1) $error = "yes"; 
if (Выражение 2) $error = "yes"; 
if (Выражение 3) $error = "yes"; 

  Ответить  
 
 автор: cheops   (04.07.2011 в 11:51)   письмо автору
 
   для: Владимир55   (03.07.2011 в 21:50)
 

Можно поступить следующим образом
<?php
  $text 
"==========ВВВВВВВВВВВБольшая Советская Энциклопедия (БСЭ) содержит 
  огромное количество информации по всем областям человеческих знаний. 
5555555555555555555555555555555 От-искусства-и-культуры_до_науки_и_техники. 
Огромноеколичествостатейпосвященобио графиямвидныхсоветскихииностранныхд еятелей "
;
  
$error "no";
  
// 1. в переменной $text имеются четыре и более одинаковых знака, 
  // идущие подряд, и эти знаки не являются цифрами;
  
$pattern "|([^\s\d])\\1{4,}|";
  if(
preg_match($pattern$text)) $error "yes";
  
// 2. в переменной $text имеется целое число, содержащее более более 12 цифр;
  
$pattern "|\d{12,}|";
  if(
preg_match($pattern$text)) $error "yes";
  
// 3. в переменной $text имеется слово, длиннее 20 знаков.
  
$pattern "|\b[\w]{20,}\b|";
  if(
preg_match($pattern$text)) $error "yes";
  echo 
$error;
?>

  Ответить  
 
 автор: Владимир55   (04.07.2011 в 14:16)   письмо автору
 
   для: cheops   (04.07.2011 в 11:51)
 

Все превосходно, вот только не выполняется третье условие, если слова склены небуквами и нецифрами. Например, так:
$text = "ee-eeeee-eeeee-eeeee-eeee-ee";


Или так:
$text = "ee=eeeee=eeeee=eeeee=eeee=ee";


Или так:
$text = "ee>eeeee>eeeee>eeeee>eeee>ee";


Или так:
$text = "ee:eeeee:eeeee;eeeee.eeee/ee";

  Ответить  
 
 автор: cheops   (04.07.2011 в 15:52)   письмо автору
 
   для: Владимир55   (04.07.2011 в 14:16)
 

Тогда замените его следующим регулярным выражением
$pattern = "|\b[\S]{20,}\b|";

  Ответить  
 
 автор: Владимир55   (04.07.2011 в 17:00)   письмо автору
 
   для: cheops   (04.07.2011 в 15:52)
 

Превосходно получилось!

Большое спасибо!

  Ответить  
 
 автор: Deed   (04.07.2011 в 21:36)   письмо автору
 
   для: cheops   (04.07.2011 в 15:52)
 

Дорогой гуру! Я теоретически понял регулярку: ([^\s\d])\\1{4,}, но вот проверить ее на практике не удается. Не работает.
Простите, был вынужденный перерыв в их изучении. Буду рад, если объясните "на пальцах".
Спасибо.

  Ответить  
 
 автор: cheops   (04.07.2011 в 22:22)   письмо автору
 
   для: Deed   (04.07.2011 в 21:36)
 

А как проверяете работу регулярного выражения, что у вас выводит следующий скрипт?
<?php 
  $text 
"ВВВВВВВВВВВ"
  
$pattern "|([^\s\d])\\1{4,}|";
  if(
preg_match($pattern$text)) echo "Все-таки работает<br>";
  else echo 
"Нет, у меня не работает<br>";
  
$text "ВфВфВфВфВфВфВфВфВфВфВ"
  if(
preg_match($pattern$text)) echo "Нет, ничего не работает";
  else echo 
"А вот это уже не срабатывает";
?>
В некоторых системах регулярное выражение вполне может не работать, так как тут используется "карман", причем не в последующих параметрах функций, а прямо в регулярном выражении, насколько известно, не все библиотеки это поддерживают.

([^\s\d]) - это один символ, отличный от пробела и числа.
\\1 - тот же самый символ, вернее ссылка на первые круглые скобки, вы наверняка много раз встречались с этой последовательностью при замене при помощи preg_replace(), только при замене, мы используем эту последовательность во втором параметре, который подставляется вместо найденной подстроки.
\\1{4,} - четыре или более подряд идущих одних и тех же символов, просто [^\s\d] - выдаст последовательность 4 первых попавшихся символов, а это выражение именно одинаковых.

  Ответить  
 
 автор: Владимир55   (06.07.2011 в 13:58)   письмо автору
 
   для: cheops   (04.07.2011 в 22:22)
 

cheops, можно ли еще составить два условия?

1. На случай, когда идут подряд повторяющиеся слова (хотя бы два соседних слова одинаковы, желательно без учета регистра). Типа
$text = "Ремонт ремонт ремонт ремонт квартир";

При этом не забанить правильные выражения, пишушиеся через тире. Типа "далеко-далеко", "быстро-быстро", или с частичным вхождением (Иван Иванович) и т.п.

2. Повторяющиеся пары слов. Типа
$text = "хочу пива хочу пива хочу пива с воблой";

  Ответить  
 
 автор: cheops   (06.07.2011 в 14:40)   письмо автору
 
   для: Владимир55   (06.07.2011 в 13:58)
 

Вот с этим уже сложнее, надо подумать... если придумаю(вспомню) решение - отпишусь.

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

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