Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/79: Рейтинг темы: голосов - 79, средняя оценка - 4.62
36 / 36 / 4
Регистрация: 17.05.2012
Сообщений: 157
1

Удаление повторяющихся слов

17.12.2013, 22:01. Показов 16504. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребята, пишу первое регулярное выражение. Нужно удалить повторяющиеся слова в строке без учета регистра.
Я сделал так:
PHP
1
2
3
4
5
6
echo 'Вот, что Вы ввели: '.$text;
echo '<br>';
 
$text = preg_replace('/\s(\w+\s)\1/i', "$1", $text);
 
echo 'А вот что получилось '.$text;
В итоге мне выводит тоже самое, что я и вводил. т.е ничего не происходит.
Подскажите, что я сделал не так?
Спасибо
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.12.2013, 22:01
Ответы с готовыми решениями:

Удаление из массива повторяющихся элементов
Как удалить из массива повторяющиеся элементы?

Удаление повторяющихся слов
Задание: из текста, который вводит пользователь, нужно удалить повторяющиеся слова. Пример: просто...

Удаление повторяющихся слов
На вход - предложение. Необходимо удалить повторяющиеся слова. В программе нельзя использовать...

Поиск повторяющихся слов и их удаление
Задача: для заданного текста определить 1)сколько раз каждое слово встречается в тексте ...

10
Заблокирован
17.12.2013, 22:08 2
PHP
1
$text = preg_replace("/.+/i", ".", $text);
0
36 / 36 / 4
Регистрация: 17.05.2012
Сообщений: 157
17.12.2013, 22:10  [ТС] 3
Так он удаляет все =\
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
18.12.2013, 13:24 4
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Gura Посмотреть сообщение
Нужно удалить повторяющиеся слова в строке без учета регистра.
вообще, задача не совсем подходит для регулярок. Вернее подходит но это примерно как пузырьковая сортировка: памяти кушать будет мало, однако сложность алгоритма высокая (вроде стремится к O(n^2), но можно попробовать посчитать точнее, при необходимости). но если нужно именно ими, то как-то так:
Код
php -r "$text='aa bb cc Bb';echo preg_replace('/(\b\w++\b)(?=.*?\1)/si', '', $text);"
Добавлено через 2 минуты
ваша регулярка
Код
\s(\w+\s)\1
делает так: сначала пробельный символ, потом слово потом пробельный, и потом сразу же повторение того, что стояло до этого. т.е. оно вырежет только те повторяющиеся слова, которые идут подряд. и при этом еще обязательно это должно быть не последнее слово в строке, иначе \w\s не совпадет

Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от NEbO Посмотреть сообщение
(?=.*?\1)
и да, разумеется тут без разницы инвертировать жадность или нет. просто в одном случае оно пойдет с конца в начало, а в другом наоборот. в моем случае оно пойдет вперед и будет проверять. помоему так обычно логичнее

3
0 / 0 / 0
Регистрация: 18.12.2013
Сообщений: 2
18.12.2013, 15:31 5
NEbO, Прошу прощения что встреваю в тему просто самому нужно удалить повторы слов, то что вы показали работает, НО она удаляет все повторы а мне надо первое слово оставить и удалять только остальные слова которые его повторяют

Помогите пожалуйста а то СЕОшник замучил совсем

Добавлено через 1 час 17 минут
В итоге при помощи NEbO, получилась такая функция
PHP
1
2
3
4
5
6
7
8
# Удаление повторяющихся слов
function delete_duplicates_words($text)
{
    $text = implode(array_reverse(preg_split('//u', $text)));
    $text = preg_replace('/(\b[\pL0-9]++\b)(?=.*?\1)/siu', '', $text);
    $text = implode(array_reverse(preg_split('//u', $text)));
    return $text;
}
Которая работает с русскими словами в utf-8
0
36 / 36 / 4
Регистрация: 17.05.2012
Сообщений: 157
18.12.2013, 16:27  [ТС] 6
NEbO, Спасибо! Работает! Правда только с английскими буквами в utf -8.
0
0 / 0 / 0
Регистрация: 18.12.2013
Сообщений: 2
18.12.2013, 16:31 7
Почему только с английскими буквами у меня прекрасно работает с русскими буквами в utf-8
0
36 / 36 / 4
Регистрация: 17.05.2012
Сообщений: 157
18.12.2013, 16:34  [ТС] 8
Не знаю)

NEbO, вот Вы сказали, что моя задача не совсем под регулярки. А допустим удалить слова, у которых с обеих сторон одинаковые знаки препинания,подходит?
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
18.12.2013, 17:29 9
Цитата Сообщение от Gura Посмотреть сообщение
удалить слова, у которых с обеих сторон одинаковые знаки препинания
Код
php -r "$text='aaa ,bcd? ,tyu, bb'; echo preg_replace('~([^\s])\b\w++\b\1~u', '', $text);"
ближе. для регулярок на основе нка подходит. впрочем, "подходит", не "подходит", это уж вы для себя решайте. по сложности. просто то решение в регулярках решается неоптимально (хотя конкретно для пхп, возможно, это и будет лучшее решение). но опять же, все условия -- они известны только вам. возможно, вам нужно логи разобрать или старый текст какой-то один раз, или вообще у вас стоит жесткое ограничение по длине входящего поля. или данные не могут быть наихудшими -- тогда обычно это имеет мало значения. я просто указал что теоретически это не совсем верное решение. как в случае с "классической" пузырьковой сортировкой в одноядерной системе, это довольно редко будет оптимальным решением какой-то конкретной задачи.
но ни в первом ни во втором случае это не настолько критично что прям взять выкинуть и все. очень часто бывают регулярки и похуже. если вам неинтересны все эти выкладки по сложности алгоритмов, не мучайтесь и не терзайте себе душу
1
36 / 36 / 4
Регистрация: 17.05.2012
Сообщений: 157
18.12.2013, 17:40  [ТС] 10
Огромное спасибо!
0
NEbO
18.12.2013, 17:45     Удаление повторяющихся слов
  #11

Не по теме:

Цитата Сообщение от NEbO Посмотреть сообщение
просто то решение в регулярках решается неоптимально (хотя конкретно для пхп, возможно, это и будет лучшее решение)
а решив что решение нерешабельно, порешите его порешабельно решабельными средствами.... мда, гугль точно меня когда нибудь забанит за повторение ключевиков

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2013, 17:45

Строки. Удаление повторяющихся слов
Добрый вечер, всё никак не получается удалить одинаковые слова, помогите пожалуйста. uses crt;...

Удаление повторяющихся слов в строке
Помогите с написанием программы на ассемблере, которая в строке удаляет повторяющиеся слова и...

Удаление повторяющихся слов из файла
Здравствуйте. Задача состоит в том, чтобы в полученном текстовом файле выполнить поиск...

Удаление повторяющихся слов из стоки на C
Здравствуйте. Помогите пожалуйста реализовать задачу: Дана строка. Группа символов разделленая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru