New! Telegram канал про микроконтроллеры, SDR приемники, радиолюбительство и электронику в целом:

t.me/HighFrequency

На правах рекламы:

Регулярные выражения. Выборка целых предложений, включающих ключевые слова. 2 января 2009 г.

Задача: написать паттерн для функции preg_match_all, предназначенной для выборки контекста для ключевых слов при полнотекстовом поиске.

$pattern = "/(?![^.]s+)(?![^.]s+[("`'])(["`']?[А-Я][^.!?]*W+(".
            $keyword_s.
            ").?[^.!?]+([.!?][^.!?]*){1,3}?)(?=.[sZ])/i";


Логика: предложение начинается с заглавной буквы, но при этом, ей не может предшествовать последовательность из НЕ-точки и пробела (например, Имена внутри предложения), так же как и последовательность из НЕ-точки, пробела и кавычки (разных видов) (например, "Названия" внутри предложения), концом предложения является либо точка, либо восклицательный, либо вопросительный знаки. Чтобы избежать захвата части сокращения, типа "т.д.", "т.п.", после завершающей точки должен слдоваться либо пробел, либо конец данных. Паттерн, будучи использован в preg_match_all вылавливает все предложения (или пару-тройку предложений), где фигурирует кейворд...

Для того, чтобы паттерн возымел действие, поместим его в функцию:


preg_match_all($pattern, $text, $matches);
$context = "«...".
           stripslashes(
                preg_replace(
                   "/($keyword_h)/i",
                   "<b></b>",
                   implode("...&raquo;, &laquo;...",$matches[0])
                )
           ).
           "...&raquo;";

В последнем блоке паттерн применяется к исходному тексту, затем выделенные предложения соединяются, одновременно обрамляясь кавычками. При этом ключевые слова выделяются жирным шрифтом.

Чуть не забыл. переменные $keyword_s и $keyword_h должны быть подготовлены к использованию с несколькими ключевыми словами. Делается это очень просто:

$keyword_s = preg_replace("/([^0-9а-яА-ЯёЁ]+)/", "|", $keyword); 
$keyword_h = preg_replace("/([0-9а-яА-ЯёЁ]+)/", "w*", $keyword);
$keyword_h = preg_replace("/([^0-9а-яА-ЯёЁw*]+)/", "|", $keyword_h);

Для большого паттерна слова достаточно разделить символом "|", а для паттерна подсветки к каждому ключевому слову необходимо добавить "w*", на случай, если из слова введены лишь первые его буквы.

Разумеется, все это можно усложнить, но для простого поиска по сайту с использованием возможностей Fulltext Search в MySQL, вполне подойдет.


comments powered by Disqus

 

Про радио 4

 

Про микроконтроллеры 1

 

Про фото 27

 

Блог 35

 

Про кино 8

 

Про WEB 6

 

 

New! Telegram канал про микроконтроллеры, SDR приемники и радиолюбительство в целом:

t.me/HighFrequency

 

Поток сознания тут — twitter.com/shtorkin

И тут — facebook.com/shtorkin

Сюда можно писать в ЛС — vk.com/shtorkin

Youtube — youtube.com/user/SemenShtorkin

Картинки — instagram.com/shtorkin


  © 2007 – 2018 Семен Шторкин (Семен Орлов)
Для связи:

Все права на представленные на сайте материалы принадлежат Семену Орлову, если не указано иного. При копировании материалов активная индексируемая ссылка на сайт «shtork.in» обязательна.