PHP - Показать поиск слова с 5 окружающих слов

Я здесь новичок. У меня есть вопрос о PHP. Я работаю над проектом в данный момент. И теперь есть проблема.

Итак, в первую очередь: каково мое "желание": есть текстовый файл, он содержит такой контент:

John Brown: Lives in New York, married, have 3 sons and love playing football

Теперь мне нужен код PHP, который читает и ищет текстовый файл, НО показывает только специальное поисковое слово с 5 словами, окружающими искомое слово, так что результат должен быть таким: Я ищу сыновей, результат должен быть:John Brown: Have 3 sons and love playing, РЕДАКТИРОВАТЬ: забыл сказать, что имя Джон Браун должен остаться в результатах поиска.

Пожалуйста, помогите мне. Извините за мой плохой английский, живущий в Германии:)

Вот что я пробовал до сих пор:

<?php
$search = 'sons';
$lines = file('file.txt'); 
// Store true when the text is found 
$found = false;
foreach($lines as $line) { 
  if(strpos($line, $search) !== false) { $found = true; echo $line; } 
} 
// If the text was not found, show a message 
if(!$found) { echo 'No match found'; }
?>

3 ответа

Вот, просто для ухмылки, решение, которое перебирает пробелы в счетчиках строк вместо взрыва и взрыва:

function context_find($haystack, $needle, $context) {
    $haystack=' '.$haystack.' ';
    if ($i=strpos($haystack, $needle)) {
        $start=$i;
        $end=$i;
        $spaces=0;

        while ($spaces < ((int) $context/2) && $start > 0) {
            $start--;
            if (substr($haystack, $start, 1) == ' ') {
                $spaces++;
            }
        }

        while ($spaces < ($context +1) && $end < strlen($haystack)) {
            $end++;
            if (substr($haystack,$end,1) == ' ') {
                $spaces++;
            }
        }

        while ($spaces < ($context +1) && $start > 0) {
            $start--;
            if (substr($haystack, $start, 1) == ' ') {
                $spaces++;
            }
        }

        return(trim(substr($haystack, $start, ($end - $start))));
    } else {
        return false;
    }
}

Например:

$h="Twas brillig and the slithy toves did gyre and gimbel in the wabe";
$n="toves";
$c="5";

print context_find($h, $n, $c)."\n";

Возвращает:

the slithy toves did gyre

Кроме того, он пытается вернуть нужное количество контекста, даже если поисковый термин находится слишком близко к началу или концу:

$h="Twas brillig and the slithy toves did gyre and gimbel in the wabe";
$n="brillig";
$c="5";

print context_find($h, $n, $c)."\n";

Возвращает:

Twas brillig and the slithy

Или даже:

$h="Twas brillig and the slithy toves did gyre and gimbel in the wabe";
$n="wabe";
$c="5";

Который возвращает:

and gimbel in the wabe

Это, конечно, ничего не делает для обхода вашего входного файла и т. Д., Для чего достаточно других примеров.

Для меня это звучит как проблема, очень хорошо решаемая регулярными выражениями.

function find_words($haystack, $needle) {
    $regex = '%\w+\s\w+\s' . preg_quote($needle) . '\s\w+\s\w+%';

    if (preg_match($regex, $haystack, $matches)) {
        return $matches[0];
    } else {
        return false;
    }
}

$s = 'John Brown: Lives in New York, married, have 3 sons and love playing football';
$search = 'sons';
var_dump(find_words($s, $search));

\ w + - это одно или несколько символов слова, \s - это пробел, а в середине - слово, которое вы ищете. Очень легко сопоставить больше слов или других символов или сделать не точное совпадение слов, в зависимости от ваших потребностей.

Этот код является лишь примером того, как я это сделаю, и он еще не закончен.

  function search($query,$str){
     $words = explode(' ',$str);
     $index = array_search($query, $words);
     return implode(' ', array_slice($words, $index-2, 6)); // sanitate "length of the array" vs $index
  }
  $file = file_get_contents('data');

  echo  search('sons',$file);

Эта функция будет возвращать строку с 2 словами вокруг искомого слова.

Помните, что $ file может содержать более одного искомого слова, а $index-2 может быть меньше длины массива $words.

Если ваш файл данных содержит 1 предложение в 1 строке, вы можете использовать его следующим образом

  $file = file('data');
  foreach ($file as $line){
    echo search('sons',$line)."\n";
  }

Formore, если имя в каждой строке определено как "$Name: $ предложение", используйте эту функцию, чтобы найти его

  function findName($str){
    $name = explode(':',  $str);
    return $name[0];
  }

В совокупности это выглядит так:

  function search($query,$str){
     $words = explode(' ',$str);
     $index = array_search($query, $words);
     if ($idex === false){
       return false;
     }
     else{
     return implode(' ', array_slice($words, $index-2, 6)); // sanitate "length of the array" vs $index
     }
  }
  function findName($str){
    $name = explode(':',  $str);
    return $name[0];
  }

  $file = file('data');
  foreach ($file as $line){
    $string =  search('sons',$line);
    if ($string !== false){
      echo findName($line).': '.$string."\n";
    }
  }

Вы должны быть в состоянии закончить код самостоятельно. Если нет, дайте мне знать.

Другие вопросы по тегам