ExBB Community ExBB Community
 Сайт проекта ExBB Общение объединяет!
Войдите на форум при помощиВойти через loginza
 Чат на форуме      Помощь      Поиск      Пользователи     BanList BanList


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

> Без описания
yura3d
Отправлено: 20 февраля 2009 — 16:14
Post Id


Пользователь
ExBB Team
ExBB Developer
ExBB Mods Author


Покинул форум
Сообщений всего: 3394
Дата рег-ции: Февр. 2009  
Откуда: Минск, Беларусь
Репутация: 353




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

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

Проблема касается только кириллицы, однако локаль на сервере установлена корректно (у других функций обработки строк, учитывающих локаль, ошибок нет). Если не устанавливать локаль, то кириллица не обрабатывается вообще. К сожелению что-либо толковое по регулярным выражениям найти сложно, перепробовал множество вариантов, проблема так и осталась. Надеюсь кто-нибудь из более разбирающихся с регулярными выражениями поможет. И ещё желательно сделать это выделение независимым от установленной локали
 
 
Александр Михалицын
Отправлено: 21 февраля 2009 — 07:34
Post Id


Администратор
Super Member


Покинул форум
Сообщений всего: 723
Дата рег-ции: Февр. 2009  
Репутация: 42




yura3d,
я так и непонял какой тебе нужен результат. Покажи как должно.
 
 
yura3d
Отправлено: 21 февраля 2009 — 12:12
Post Id


Пользователь
ExBB Team
ExBB Developer
ExBB Mods Author


Покинул форум
Сообщений всего: 3394
Дата рег-ции: Февр. 2009  
Откуда: Минск, Беларусь
Репутация: 353




Красным должны выделяться слова, имеющие длину менее 4-ёх символов. Т.е. в том примере, что приводил я выше, должно быть выделено только слово "мод"
 
 
Furax
Отправлено: 22 февраля 2009 — 06:04
Post Id



Пользователь
Newbie


Покинул форум
Сообщений всего: 49
Дата рег-ции: Февр. 2009  
Репутация: 8




Во-первых, кавычки вокруг регулярного выражения и строки замены лучше бы поставить одинарные, чтобы интерпретатор не пытался подставить туда спецсимволы '\b' и переменную $1.

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


Пользователь
ExBB Team
ExBB Developer
ExBB Mods Author


Покинул форум
Сообщений всего: 3394
Дата рег-ции: Февр. 2009  
Откуда: Минск, Беларусь
Репутация: 353




Furax пишет:
Во-первых, кавычки вокруг регулярного выражения и строки замены лучше бы поставить одинарные, чтобы интерпретатор не пытался подставить туда спецсимволы '\b' и переменную $1.

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

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



Пользователь
Newbie


Покинул форум
Сообщений всего: 49
Дата рег-ции: Февр. 2009  
Репутация: 8





Кстати, всегда было интересно: а откуда вообще берётся это ограничение снизу на длину слов в поисковом запросе?
 
 
yura3d
Отправлено: 23 февраля 2009 — 13:12
Post Id


Пользователь
ExBB Team
ExBB Developer
ExBB Mods Author


Покинул форум
Сообщений всего: 3394
Дата рег-ции: Февр. 2009  
Откуда: Минск, Беларусь
Репутация: 353




Furax пишет:

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

Всё что меньше 4-ёх символов подразумевается что это не слова, а предлоги, союзы и т п. Конечно такой подход не совсем идеальный, зато его реализация проще. Чем меньше слов будет в базе индексации, там быстрее происходит поиск и меньше нагрузка на сервер
 
 
yura3d
Отправлено: 28 февраля 2009 — 21:30
Post Id


Пользователь
ExBB Team
ExBB Developer
ExBB Mods Author


Покинул форум
Сообщений всего: 3394
Дата рег-ции: Февр. 2009  
Откуда: Минск, Беларусь
Репутация: 353




Решил не создавать новой темы, поскольку новый вопрос тоже касается регулярных выражений.
Есть некоторая строка:
CODE:
слово1 слово2 'слово3' слово4 'сло\'во5'

Из этой строки нужно выделить все слова или фразы, заключённые в кавычки. При этом если слово или фраза сами содержат кавычку, то она в исходной строке предваряется обратным слешэм и не должна учитываться как конец фразы. Да, и ещё один важный момент, слова/фразы могут состоять из любых символов
 
 
Furax
Отправлено: 1 марта 2009 — 04:43
Post Id



Пользователь
Newbie


Покинул форум
Сообщений всего: 49
Дата рег-ции: Февр. 2009  
Репутация: 8




Это сделать можно, к примеру, вот так:
CODE:
$words = "Word1 'word2\\nNewLine' word3 'word\\'4' word5 ''";

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

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


Пользователь
ExBB Team
ExBB Developer
ExBB Mods Author


Покинул форум
Сообщений всего: 3394
Дата рег-ции: Февр. 2009  
Откуда: Минск, Беларусь
Репутация: 353




Furax
Спасибо!
 
 
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« PHP/Perl »

> Похожие темы: Выделение коротких слов
Темы Форум Информация о теме Обновление
Дополнение: Удобочитаемый вывод даты и времени
Например: Вместо вывода сегодняшней даты - слово "Сегодня"
Модификации и дополнения Ответов: 36
Автор темы: yura3d
4 июля 2013 — 09:32
Автор: wasp
Автозамена - вставка ссылок
Ссылки из ключевых слов
Обсуждение Ответов: 66
Автор темы: alexvod
24 июля 2017 — 09:26
Автор: nikk
Установка SQLite на Denwer
Необходимое условие работы некоторых модов
Общие вопросы Ответов: 1
Автор темы: NordWest
15 апреля 2012 — 08:53
Автор: ermolai
прикольные поисковые слова
О жизни Ответов: 3
Автор темы: roma1
16 декабря 2011 — 14:31
Автор: BON
Выделение цитат в RSS
Решение проблем Ответов: 6
Автор темы: Светлана
30 сентября 2010 — 16:53
Автор: Светлана
 



Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
 




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

Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0849]     [ ]