preg_replace

maxxp2004

Guest
preg_replace

Здраствуйте.

У меня возникла такая проблема. Необходимо убрать все слова из строки менее 3 символов.

$search = preg_replace("/s([^s]{1,3})s/", " ", ereg_replace("[ ]+", " ",$search));

Но они не убираются ???
 

sakon

П..и.н..ок
круто
Не расскажешь, что твой рег делает? По пунктам.
 

maxxp2004

Guest
Мне было необходимо не давать пользователю возможности искать по слишком коротким словам - сильно загружает сервер.

Так вот я пытался разрешим искать только по словам, которые длиннее трёх букв {1,3} заменить на пробелы, а потом сжать двойные пробелы :
PHP:
$G_search=ereg_replace("[ ]+", " ", $G_search);
 

sakon

П..и.н..ок
Я хочу знать, что ты пытался сделать в реге, который ты привел в первом посте.
 

Фанат

oncle terrible
Команда форума
maxxp2004
тебе не приходило в голову решать свою задачу по частям?
 

SelenIT

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


1) может быть, не s, а \s?
2) [^\s] эквивалентно \S
3) ты сначала "сжимаешь" двойные пробелы, а уже к результату применяешь свой preg_replace, притом что
4) это совершенно лишнее - preg_replace (если исправить ошибки) сам это сделает
 

maxxp2004

Guest
to: Фанат

попробвл вот так

PHP:
$search='somthing sa';
$G_search = preg_replace("/s([^s]{1,3})s/"," ", $search);
$G_search=ereg_replace("[ ]+"," ", $G_search);
всё равно sa не убирается.
 

maxxp2004

Guest
$G_search = preg_replace("/s([^\s]{1,3})s/"," ", $search);

$G_search = preg_replace("/s([/S]{1,3})s/"," ", $search);


не убрало
 

Фанат

oncle terrible
Команда форума
maxxp2004
я все никак не пойму - на кой тебе в паттерне буквы s в начале и конце-то?
 

SelenIT

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

Второй вариант по идее просто выдает ошибку "Unknown modifier...". А первый пытается заменить последовательность из латинской буквы "s", 1-3 непробельных символов и снова буквы "s" на пробел. Внимательнее надо быть!

Имхо, с учетом того, что пробелов изначально может быть несколько,
PHP:
$G_search = preg_replace("/\s+\S{0,3})\s+/"," ", $search);
 

maxxp2004

Guest
если не сложно, подкажите как правильно реализовать, а то я перепробывал кучу вариантов и нфга не подходит :(
 

sakon

П..и.н..ок
Автор оригинала: SelenIT
preg_replace("/\s+\S{0,3})\s+/"," ", $search);
Не пройдет, если короткое слово будет стоять первым.

>что такое [^\S]? Не \s случайно?
Случайно любой не символ.
К стати работает. :)
 

maxxp2004

Guest
select he = select he
select he ge =select ge
select he ge more=select more

оно обрабатывает правильно только если в конце длинное слово если последнее маленькое, то оно остаётся
 

SelenIT

IT-лунатик :)
Не пройдет, если короткое слово будет стоять первым.
Если последним - тоже... что делать, в любом правиле есть исключения...

дабы не усложнять жизнь лишними проверками, можно решить проблему
PHP:
trim(preg_replace('/\s+\S{0,3})\s+/',' ', ' '.$search.' '));
Случайно любой не символ.
Притом в количестве ровно 1 штуки. А кстати, что такое не-символ? ;)
 

maxxp2004

Guest
с пробелами - это забавно придумано

пока это лучший из предложенных вариантов, но и у него есть глюки

67 me max select he =me select

67 max select he = max select
 

SelenIT

IT-лунатик :)
Мнда... всех возможных ситуаций не предусмотришь - в этом главная прелесть процесса отладки...
По идее фикс для последнего глюка:
/\s+(\S{0,3}\s+)+/
 

uchenik

Новичок
вот это у вас фантазия :))

PHP:
preg_replace('/\b[a-zа-яА-Яё]{1,3}\b/i', '', $text);
Вырезает русские и английские слова длинной менее 4 букв, без всяких замен пробелами.
 
Сверху