- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

В 2023 году Одноклассники пресекли более 9 млн подозрительных входов в учетные записи
И выявили более 7 млн подозрительных пользователей
Оксана Мамчуева

Как снизить ДРР до 4,38% и повысить продажи с помощью VK Рекламы
Для интернет-магазина инженерных систем
Мария Лосева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Ну два альтернативных решений выше уже дали, вот еще одно немного улучшенное
find: /([^\s]+)\s+(?:\1(\s+|$|\.|,))+/
replace: $1$2
исключения юзать по варианту предложенному RiDDi.
А что-то почему то не прокатывает вообще замена...т.е он почему то не юзает по строке.... даже пробовал просто на удаление ставить...
$z = "идет пешеход пешеход по дороге лесной лесной и радуется радуется очень сильно.";
$result = preg_replace ("/([^\s]+)\s+(?:\1(\s+|$|\.|,))+/", "", $z);
echo $result;
Тупо строка без изменений возвращается...
\1 в двойных кавычках \\1
Что за задачник такой?
Да, djdiplomat, и почему мы должны их решать за вас, а? Если хотите выучить регулярные выражения начните с чего нибудь полегче. Если за вас будут решать задачи, толкам вы так не научитесь.
---------- Добавлено 11.04.2013 в 20:10 ----------
В некоторых языках это "задачей похлеще" назвать нельзя.. python, например:
list($a, $b) = array($b, $a); :)
list($a, $b) = array($b, $a);
сколько слов лишних-то?! :)
Для этого вам нужен паттерн с двойным "assertion" (по-русски переводят как "утверждение").
Сам паттерн ищет слово, после которого следует такое же слово (это первое утверждение), при этом после него НЕ следует слово из стоп-списка (второе утверждение).
Пример в codepad: http://codepad.viper-7.com/0gRrEU
Спасибо за интересную задачку :)
Нужны пояснения - пишите.
Для этого вам нужен паттерн с двойным "assertion" (по-русски переводят как "утверждение").
Зачем? Всё сложное ненужно, всё нужное - просто. ©
#(\S+)(?!\s+(' . implode('|', $exceptions) . '))(?:\s+\1)#, '\1'
Зачем? Всё сложное ненужно, всё нужное - просто. ©
#(\S+)(?!\s+(' . implode('|', $exceptions) . '))(?:\s+\1)#, '\1'
Я бы не стал упрощать код без копания в деталях. Примеры того, что делает ваш код:
(в середне строки)
(в начале строки)
Я бы не стал упрощать код без копания в деталях.
Все равно не все так сложно
$excep = (count($exceptions)) ? '(?!\s+('.implode('|', $exceptions).'))' : '';
echo preg_replace('#(^|\s)(\S+)'.$excep.'(?:\s+\2)+#', '\1\2', $z);
fervent, спасибо большое! Остальным тоже спасибо за альтернативные варианты!
PS Я тут вижу, даже небольшой спор возник между профессионалами. Если гуру не против, мне будет очень интересно и полезно узнать, какое же из решений будет сочтено как наиболее приемлемое (идеальное).
Как по мне, так идеально то, которое учитывает все возможные варианты и дает верный ответ экономя ресурсы...
Все равно не все так сложно
$excep = (count($exceptions)) ? '(?!\s+('.implode('|', $exceptions).'))' : '';
echo preg_replace('#(^|\s)(\S+)'.$excep.'(?:\s+\2)+#', '\1\2', $z);
Вроде ничего сложного. Задача по сути переписать if-условие "если два рядом стоящих слова совпадают" И "они не встречаются в списке стоп-слов" языком регулярок. Для этого позитивные "(?=\s+\2)" и негативные "(?!..." утверждения и сделаны, разве нет?
Разница между моим и вашим кодом в замене "(?=...)" на "(?:...", т.е. позитивное утверждение или суб-паттерн. Не уверен, что именно меняется с точки зрения внутренней логики PRCE. Если оба работают - отлично! :)
Если гуру не против, мне будет очень интересно и полезно узнать, какое же из решений будет сочтено как наиболее приемлемое (идеальное).
Лучшее решение то, которое вы сами напишите. :)
Кстати еще один вариант
'/\b(\S+)'.$excep.'(?:\s+\1)+\b/', '\1'
Для этого позитивные "(?=\s+\2)" и негативные "(?!..." утверждения и сделаны, разве нет?
С утверждением для исключений согласен, а для проверки шаблона, имхо, лучше подмаска. Да, работать будет, но если слова повторяются не два а три раза?