|
|
|
| Пытаюсь вырезать из поисковой фразы слова короче трех символов, чтоб не искать союзы и т. д., получается пустая строка :)
preg_replace("/\s*\S{1,2}\s*/", " ", $_GET['text']);
пример фразы:
mt Samsung tm S5230 Star Black SE
Хотелось бы чтобы mt, tm, SE с прилежащими проблами заменились пробелом. Но мне удалось выполнить это только с трех проходов :(
$_GET['text'] = preg_replace("/\s{1,}\S{1,2}\s{1,}/", " ", $_GET['text']);
$_GET['text'] = preg_replace("/^\S{1,2}\s{1,}/", " ", $_GET['text']);
$_GET['text'] = preg_replace("/\s{1,}\S{1,2}$/", " ", $_GET['text']);
как-то неизящно :(
Кто-то может подсказать изящный вариант? | |
|
|
|
|
|
|
|
для: kosta_in_net
(11.03.2011 в 13:07)
| | А вы границей слова воспользуйтесь \b, а не пробелом. | |
|
|
|
|
|
|
|
для: cheops
(11.03.2011 в 13:39)
| | "почему-то", превращается в "почему" :( хотелось бы оставить это, как есть. Хотя, может оно и верно стратегически ;) | |
|
|
|
|
|
|
|
для: kosta_in_net
(11.03.2011 в 14:19)
| | Ну тире мы, конечно обойдем, боюсь там еще что-нибудь всплывет, поэтому так и придется в несколько заходов данные обрабатывать
<?php
$text = "Во-первых mt Samsung tm S5230 Star Black SE почему-то сломался";
$pattern = "|\b(?<!-)[^-\s]{1,2}(?!-)\b|s";
echo preg_replace($pattern, "", $text);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(11.03.2011 в 14:48)
| | трудно понять эту тайнопись...
Печему шаблон с вертикальной черты? Это опечатка? В этом случае s в конце шаблона означает многострочный поиск (с приравниваением знака новой строки обычному пробелу)?
Далее: (?<!-) тексту не предшествует дефис, затем не дефис и не пробел 1 или два раза (это, как бы поиск букв, но туда может попасть и точка, например...). А после не должно быть дефиса и на этом слово оканчивается...
Так вроде (с учетом того, что вертикальная черта все таки должна быть слешем)?
То есть, наверное лучше вот так (результат не проверял):
$pattern = "/\b(?<!-)w{1,2}(?!-)\b/s";
Но поскольку уже есть более-менее приемлемый вариант: "/\b\S{1,2}\b/"
Возникает вопрос, как лучше? Полученное выражение затем разбивается на элементы, разделенные вертикальной чертой:
$patern=str_replace(" ",'|',$patern);
затем используется для выделения найденного текста:
preg_replace("/[а-яА-Яa-zA-Z\-]*(".$patern.")[а-яА-Яa-zA-Z\-]*/i", "<b>\\0</b>", $text)
(в результате выделяются не части слов, а слова целиком, хотя и не безупречно, при поиске "мир", выделится не только "миром", но и "хромированный"). Как лучше организовать поиск и выделение найденного?
Какие мнения? | |
|
|
|
|
|
|
|
для: kosta_in_net
(11.03.2011 в 16:49)
| | >Печему шаблон с вертикальной черты? Это опечатка?
Допустимо синтаксисом. Если не нравится, можно заменить. Точку можно добавить, как и любой другой символ, который нужно исключить. С \W пожалуй еще лучше будет
<?php
$text = "Во-первых mt Samsung tm S5230 Star Black SE почему-то сломался";
$pattern = "/\b(?<!-)[^\W]{1,2}(?!-)\b/s";
echo preg_replace($pattern, "", $text);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(11.03.2011 в 17:00)
| | о, я забыл обратный слешь поставить перед W в своем примере :)
Пока остановился на варианте
"/\b(?<!-)\w{1,2}(?!-)\b/" | |
|
|
|
|
|
|
|
для: kosta_in_net
(11.03.2011 в 13:07)
| |
<?php
$wds="У попа как-то была собака и кошка на окошке из Rehau";
preg_replace("/(?<![a-zа-я-])[А-я]{1,2}\s/s","",$wds); //Пробел между словами остается
?>
|
| |
|
|
|