Поиск первых 500 букв и исключая HTML-теги? - PullRequest
0 голосов
/ 08 ноября 2010

Как я могу найти первые 500 символов, не включая HTML-тег?

Ниже я дошел до того, что ищет ключевое слово, встречающееся в тексте,

    SELECT *
    FROM root_pages

    WHERE root_pages.pg_cat_id = '2'
    AND root_pages.parent_id != root_pages.pg_id
    AND root_pages.pg_hide != '1'
    AND root_pages.pg_url != 'cms'
    AND root_pages.pg_content_1 REGEXP '[[:<:]]".$search."[[:>:]]'
    OR root_pages.pg_content_2 REGEXP '[[:<:]]".$search."[[:>:]]'

ORDER BY root_pages.pg_created DESC

Как я могу добавить в него больше условий - первые 500 букв, которые не содержат тег html?

Было бы идеально, если бы он мог искать ключевое слово только по первому абзацу - возможно ли это?

редактирование:

спасибо за помощь, ребята! это мое решение:

    # query to search for “whole word match” in SQL only, e.g. when I search for "rid", it should not match "arid", but it should match "a rid".
    # you can use REGEXP and the [[:<:]] and [[:>:]] word-boundary markers:
    $sql = "
    SELECT *
    FROM root_pages

    WHERE root_pages.pg_cat_id = '2'
    AND root_pages.parent_id != root_pages.pg_id
    AND root_pages.pg_hide != '1'
    AND root_pages.pg_url != 'cms'
    AND root_pages.pg_content_1 REGEXP '[[:<:]]".$search."[[:>:]]'
    OR root_pages.pg_content_2 REGEXP '[[:<:]]".$search."[[:>:]]'

    ORDER BY root_pages.pg_created DESC
    ";

    # use the instantiated db connection object from the init.php, to process the query
    $items = $connection -> fetch_all($sql);
    $total_item = $connection -> num_rows($sql);

    if ($total_item > 0)
    {
        foreach($items as $item)
        {
            # get the content
            if(empty($item['pg_content_2'])) $pg_content = strip_tags($item['pg_content_1']);
                else $pg_content = strip_tags($item['pg_content_2']);

            # get the first 500 letters only
            $pg_content = substr($pg_content, 0, 500);

            # get the matches
            if (preg_match("/\b(".$search.")\b/", $pg_content)) 
            {
                $match[] = $pg_content;
            }

        }

        $total_match = count($match);
        //echo $count;
    }

    if($total_match > 0)
    {
        echo '<result message="'.$total_match.' matches found! Please wait while redirecting." search="'.$search.'"/>';
    }
    else
    {
        echo '<error elementid="input" message="Sorry no results are found."/>';
    }

Ответы [ 4 ]

1 голос
/ 08 ноября 2010

Это не так просто, как удаление / пропуск тегов - вы обнаружите, что первые 500 символов часто находятся в <style> или <script> внутри <head>.

Также простое удаление тегов будет нарушено:

separate<br>words

Если вы хотите сделать это правильно, я предлагаю написать таблицу стилей XSLT в режиме вывода текста, который преобразует HTML в открытый текст, добавляя пробелы вокруг элементов уровня блока, удаляя сценарии, <head> и т. Д.

Более простой способ, , который убивает котят , заключается в предварительной обработке HTML с использованием серии регулярных выражений вместо XSLT.

После преобразования HTML в текст, который можно использовать, поместите этот текст в дополнительный столбец в базе данных и используйте его для поиска. Вы могли бы даже поставить на него индекс FULLTEXT.

0 голосов
/ 08 ноября 2010

Если вы действительно хотите сделать это из MySQL, я думаю, что наилучшим (мнением) способом было бы иметь дублированное поле, содержащее текстовую версию pg_content_1 (и pg_content_2).

Это добавляет пространство и накладные расходы памяти, но ускорит обработку во время поиска. Если у вас есть библиотека ORM, вы можете подключить событие к onSave и убедиться, что текстовые поля обновляются автоматически.

0 голосов
/ 08 ноября 2010

Для:

Как мне добавить в него больше условий? - первые 500 букв, которые не содержат тег HTML?

Вы не можете сделать это только с MySQL (по крайней мере, для решения, которое будет работать в 100% случаев) - см. Разбор HTML-кода Путь Ктулху и этот SO ответ для более подробной информации.

PHP strip_tags и substr помогут достичь желаемого.

0 голосов
/ 08 ноября 2010

Если абзац определен элементом p:

... REGEXP '<p[^>]*>'".$search."'</p>'

Не забудьте экранировать $search для специальных символов регулярного выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...