Как использовать shell exec grep для поиска нескольких слов в файле в php - PullRequest
0 голосов
/ 02 ноября 2019

Вот мой код

$words=$_GET['word'];
$words=explode(' ',$words);
$words=implode('|',$words);
$search=shell_exec( 'grep -E '.$words.' 
/home/jitu/data.txt');
$search=explode('\n',$search);
foreach($search as $line){echo '<p>'.$line.'</p>';}

Этот код лучше всего работает с одним поисковым словом, но не работает с несколькими словами

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019

При использовании переменной $ words в shell_exec необходимо заключить ее в кавычки.
Символ '|'(символ канала) передает результат команды слева команде справа.

Ваша оболочка выполняет это:

$: grep -E one|two|three data.txt 
bash: two: command not found
bash: three: command not found  

Когда она должна выполняться:

$: grep -E 'one|two|three' data.txt 
one
two

Код:

<?php
$words="one two three";
$words=explode(' ',$words);
$words=implode('|',$words);
$search=shell_exec( "grep -E '{$words}' data.txt");
$search=explode('\n',$search);
foreach($search as $line){echo '<p>'.$line.'</p>';};

Если учесть, что проходящий пользователь вводил данные в shell_exec без предварительной его очистки, вы оставляете себя уязвимым для выполнения кода.

0 голосов
/ 02 ноября 2019

Использование оболочки для этого не очень хороший подход. PHP уже имеет функции, которые могут сделать это. Я бы использовал preg_match_all и file_get_contents. Предполагается, что файл не очень большой, поэтому может потребоваться fread.

$words = $_GET['word'];
$words = explode(' ',$words);
$words = implode('|',$words);
$file = file_get_contents('/home/jitu/data.txt');
preg_match_all('/^.*\b(' . $words . ').*$\b/m', $file, $search);
foreach($search[0] as $line){
     echo '<p>'.$line.'</p>';
}

Я также добавил границы слов в ваше регулярное выражение, чтобы отдельные слова не совпадали. Модификатор m - это совпадение ^$ для каждой строки, а не для всего файла. .* означает, что все до / после матча будет записано. Если вы просто хотите узнать, какие термины совпали, можно использовать $search[1].

Дополнительное примечание: пользовательский ввод никогда не должен передаваться непосредственно в оболочку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...