preg_replace

SelenIT

IT-лунатик :)
uchenik
Идея понятна, только в словах бывают еще и цифры и прочие символы...

По зрелому размышлению, пожалуй, рискну предложить такой вариант (c заменой пробелами):
PHP:
trim(preg_replace('/\s*\b\S{1,3}\b\s*/i', ' ', $text));
А вообще, как говорится, нет предела совершенству :)
 

uchenik

Новичок
SelenIT

1. "\b" - указывает границы слова, поэтому вставлять в регулярку "\s*" смысла нет.

2. Непонятно зачем заменять вырезаемые слова на лишние пробелы. Функция trim() обрежет пробелы лишь по краям строки.

3. Если нужно вырезать и числа, то ничего не мешает добавить в символьный класс "\d" и регулярка будет выглядеть так:
PHP:
preg_replace('/\b[a-zа-яА-Яё\d]{1,3}\b/i', '', $text);
Но на мой взгляд числа вырезать как раз не следует, ибо они как раз несут смысловую нагрузку при поиске. Например: "75 года рождения", "Siemens C55", "бомбардировщик Б52" и т.д.
 

SelenIT

IT-лунатик :)
uchenik

1. Смысл этого всего - получить последовательность длинных слов, разделенных одиночными обычными пробелами. Поэтому и делается замена коротких слов, двойных пробелов, всяких табуляций и т.п. на обычные пробелы. Это бывает оправдано, хотя все зависит от трактовки задачи и особенностей реализации.

2. Мда... тут я чего-то намудрил и не досмотрел - после идущих подряд замен в моем варианте действительно оставались лишние пробелы. Спасибо за полезное замечание). Справедливости ради - твоя регулярка тоже оставляет множественные пробелы.

3. Имхо, а-яА-Яё с модификатором i как раз не имеет смысла - при правильно настроенной локали хватит и маленьких букв, а при неправильной в случае кодировки win1251 потеряешь большую букву Ё, а в общем случае вообще нет гарантии, что русские буквы идут подряд в кодовой таблице. А чтобы пропустить при замене короткие последовательности цифр, можно использовать что-нибудь вроде [^\s\d]{1,3}.

4. А ведь еще есть знаки препинания, которые тоже являются границей слова. Их, по идее, тоже надо вырезать...

Еще вариант с учетом замечаний и KIS-принципа:
PHP:
preg_replace('/(\s+|\b[^\d]{1,3}\b)+/sm', ' ', $text);
 
Сверху