ExBB Community » » PHP/Perl » Выделение коротких слов

Страниц (1): [1]
 

1. yura3d - 20 февраля 2009 — 16:14 - перейти к сообщению
Столкнулся с довольно интересной проблемой. Задача состоит в том чтобы выделить все слова короче 4-ёх символов (используется в поисковом алгоритме ExBB). Вот как я это делаю:
CODE:
preg_replace("/\b([a-zA-Zа-яА-Я]{1,3})\b/","<font color=\"red\">$1</font>",'форум подфорум поиск мод');

Вроде бы ничего сложного, под Windows всё работает правильно. А вот под Unix возникли некоторые проблемы, вот что получается в результате:
Цитата:
форум подфорум поиск мод

Проблема касается только кириллицы, однако локаль на сервере установлена корректно (у других функций обработки строк, учитывающих локаль, ошибок нет). Если не устанавливать локаль, то кириллица не обрабатывается вообще. К сожелению что-либо толковое по регулярным выражениям найти сложно, перепробовал множество вариантов, проблема так и осталась. Надеюсь кто-нибудь из более разбирающихся с регулярными выражениями поможет. И ещё желательно сделать это выделение независимым от установленной локали
2. Александр Михалицын - 21 февраля 2009 — 07:34 - перейти к сообщению
yura3d,
я так и непонял какой тебе нужен результат. Покажи как должно.
3. yura3d - 21 февраля 2009 — 12:12 - перейти к сообщению
Красным должны выделяться слова, имеющие длину менее 4-ёх символов. Т.е. в том примере, что приводил я выше, должно быть выделено только слово "мод"
4. Furax - 22 февраля 2009 — 06:04 - перейти к сообщению
Во-первых, кавычки вокруг регулярного выражения и строки замены лучше бы поставить одинарные, чтобы интерпретатор не пытался подставить туда спецсимволы '\b' и переменную $1.

А замену независимо от локали можно сделать так:
CODE:
echo preg_replace('/([^a-zA-Zа-яА-Я]|^)([a-zA-Zа-яА-Я]{1,3})(?![a-zA-Zа-яА-Я])/', '$1<font color="red">$2</font>', 'я ты он она форум подфорум поиск мод');
5. yura3d - 22 февраля 2009 — 10:21 - перейти к сообщению
Furax пишет:
Во-первых, кавычки вокруг регулярного выражения и строки замены лучше бы поставить одинарные, чтобы интерпретатор не пытался подставить туда спецсимволы '\b' и переменную $1.

А замену независимо от локали можно сделать так:
CODE:
echo preg_replace('/([^a-zA-Zа-яА-Я]|^)([a-zA-Zа-яА-Я]{1,3})(?![a-zA-Zа-яА-Я])/', '$1<font color="red">$2</font>', 'я ты он она форум подфорум поиск мод');

Да, с кавычками действительно прокололся Смущение
Спасибо Улыбка
6. Furax - 23 февраля 2009 — 04:31 - перейти к сообщению

Кстати, всегда было интересно: а откуда вообще берётся это ограничение снизу на длину слов в поисковом запросе?
7. yura3d - 23 февраля 2009 — 13:12 - перейти к сообщению
Furax пишет:

Кстати, всегда было интересно: а откуда вообще берётся это ограничение снизу на длину слов в поисковом запросе?

Всё что меньше 4-ёх символов подразумевается что это не слова, а предлоги, союзы и т п. Конечно такой подход не совсем идеальный, зато его реализация проще. Чем меньше слов будет в базе индексации, там быстрее происходит поиск и меньше нагрузка на сервер
8. yura3d - 28 февраля 2009 — 21:30 - перейти к сообщению
Решил не создавать новой темы, поскольку новый вопрос тоже касается регулярных выражений.
Есть некоторая строка:
CODE:
слово1 слово2 'слово3' слово4 'сло\'во5'

Из этой строки нужно выделить все слова или фразы, заключённые в кавычки. При этом если слово или фраза сами содержат кавычку, то она в исходной строке предваряется обратным слешэм и не должна учитываться как конец фразы. Да, и ещё один важный момент, слова/фразы могут состоять из любых символов
9. Furax - 1 марта 2009 — 04:43 - перейти к сообщению
Это сделать можно, к примеру, вот так:
CODE:
$words = "Word1 'word2\\nNewLine' word3 'word\\'4' word5 ''";

echo preg_replace("/'(([^'\\\\]|(\\\\.))*)'/", '<font color="red">\'$1\'</font>', $words);
Поскольку выражение сложное, расшифрую: читаем открывающую кавычку; затем любые символы, кроме кавычек и бэкслэшей; если же напоролись на бэкслэш - читаем его и следующий символ после него (не глядя); в конце читаем закрывающую кавычку. Бэкслэш в регулярном выражении приходится отбивать ажно тремя бэкслэшами: один - из-за того, что он в регулярке, и ещё по одному перед каждым из тех двух - потому что регулярка в строке.

Если звёздочку заменить на плюсик - кавычки, между которыми нет ни одного символа, обрабатываться не будут.
10. yura3d - 1 марта 2009 — 08:23 - перейти к сообщению
Furax
Спасибо!

Яндекс.Метрика   

Powered by ExBB
[Script Execution time: 0.0419]     [ ]