所以,首先:我的#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'; }
?>
答案 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";
}
}
您应该能够自己完成代码。如果没有,请告诉我。