PHP найти фрагмент содержимого из preg_match - PullRequest
0 голосов
/ 22 июля 2010

Хорошо, скажите, у меня есть параграф:

Получив первый и последний раз за свою жизнь, Дюрант с дивана наблюдал, как американская команда впадает в игру с золотой медалью.и затем был протестирован Испанией, в конечном итоге одержав победу со счетом 118-107, которая положила конец восьмилетней засухе с золотой медалью для мужской сборной США.Но засуха с золотой медалью для американцев на чемпионате мира ФИБА осталась нетронутой, теперь, когда ей уже 16 лет, и считается, что сборная США готовится отправиться в Турцию без кого-либо из членов так называемой команды спасения из Пекина.

Что я хотел бы сделать, это запустить php preg_match_all несколько ключевых слов (скажем, например, 'team' и 'for') для текста, а затем извлечь фрагмент (возможно, 10 слов)до и 10 слов после) для каждого найденного результата.

Кто-нибудь знает, как это можно сделать?

Ответы [ 4 ]

2 голосов
/ 22 июля 2010

Вы можете сделать это:

  • Получить список всех слов и их смещений, используя preg_match_all с флагом PREG_OFFSET_CAPTURE .
  • Итерируйте слова и найдите поисковый запрос.
  • Получите x слова до и после матча.

Вот пример:

preg_match_all('/[\w-]+/u', $str, $matches, PREG_OFFSET_CAPTURE);
$term = 'team';
$span = 3;
for ($i=0, $n=count($matches[0]); $i<$n; ++$i) {
    $match = $matches[0][$i];
    if (strcasecmp($term, $match[0]) === 0) {
        $start = $matches[0][max(0, $i-$span)][1];
        $end = $matches[0][min($n-1, $i+$span+1)][1];
        echo ' … '.substr($str, $start, $end-$start).' … ';
    }
}
0 голосов
/ 22 июля 2010

Что-то вроде этого поможет, имея в виду, что слова, которые вы ищете, должны быть на расстоянии около 4 слов, по крайней мере, или они не будут соответствовать этому.Таким образом, вы можете настроить важность отношения между ключевыми словами

preg_match_all("~([\w]+[\s\- ,]+){0,3}watched([\s\- ,]+[\w]+){0,4}\ssofa([\s\- ,]+[\w]+){0,3}~i", $text, $matches);
0 голосов
/ 22 июля 2010

Вы можете найти много интересных идей в конструкторе поисковых запросов Drupal.

http://api.drupal.org/api/function/search_excerpt/6

Этот код безопасен в UTF8 и охватывает все виды краевых случаев.

0 голосов
/ 22 июля 2010

Отметьте это http://www.php.net/manual/en/regexp.reference.squarebrackets.php

Итак, это одно слово с разделителем:

([:word:].*[:punct:])

Это десять слов с разделением.

([:word:].*[:punct:]){10}

Что-то вродеэто будет близко к вашему решению:

([:word:].*[:punct:].){10}team([:punct:].[:word:].*){10}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...