PHP - 用5个周围的单词显示搜索单词

时间:2014-03-31 13:27:16

标签: php search text text-files words

我是新来的。我有一些关于PHP的问题。我正在做一个项目。现在有一个问题。

所以,首先:我的#34;愿望": 有一个文本文件,它包含这样的内容:

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

现在我需要一个PHP代码,它可以读取和搜索文本文件,但是只显示搜索单词周围有5个单词的特殊搜索单词,因此结果应如下所示: 我正在搜索儿子,结果应该是: John Brown: Have 3 sons and love playing编辑:忘了说, John Brown 这个名字应该留在搜索结果中。

请帮帮我。 抱歉,我的生活很糟糕,住在德国:)

这是我到目前为止所尝试的内容:

<?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 个答案:

答案 0 :(得分:3)

对我而言,这听起来像是一个由正则表达式处理得很好的问题。     

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是空格,中间是您要搜索的单词。根据您的需要,很容易匹配更多单词或其他字符或进行不完全匹配的单词。

答案 1 :(得分: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

当然,这对于循环输入文件等没有任何作用,其他示例就足够了。

答案 2 :(得分:1)

这段代码只是我如何做到的一个例子,并没有完成。

  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";
  }

此外,如果每行的名称定义为&#34; $ Name:$ sentence&#34;使用此功能找到它

  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";
    }
  }

您应该能够自己完成代码。如果没有,请告诉我。