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";
}
}
Вы должны быть в состоянии закончить код самостоятельно. Если нет, дайте мне знать.