2015-05-04 4 views
0

У меня есть этот скрипт поиска:Отфильтровывать определенную строку в текстовом файле

$search = $_GET["search"]; 
    $logfile = $_GET['logfile']; 
    $file = fopen($logfile, "r"); 

?> 
<head> 
    <title>Searching: <?php echo $search ?></title> 
</head> 
<?php 

    while(($line = fgets($file))!= false) { 
     if(stristr($line,$search)) { 
      // case insensitive 
      echo "<font face='Arial'> $line </font><hr><p>";         
     } 
    } 

Я хочу, чтобы отфильтровать определенную строку при поиске чего-то в текстовом файле.

Например, текстовый файл состоит в следующем:

http://test.com/?id=2022458&pid=41&user=Ser_Manji 
Ser_manji said "hello" 
Ser_manju left the game 

При поиске, например, для «Ser_manji», я хочу, чтобы отфильтровать эту строку:

http://test.com/?id=2022458&pid=41&user=Ser_Manji 

Но все-таки показать их две строки:

Ser_manji said "hello" 
Ser_manju left the game 

Надеюсь, что это возможно, я сам попытался изменить его, чтобы он не принял что касается строк, содержащих «test.com», но это не сработало.

+0

FYI: Вы можете принять ответ, который больше всего вам помог и решился на вашу проблему (http://meta.stackexchange.com/q/5234)! – Rizier123

ответ

1

Это должно работать для вас:

Просто получить файл в массив с file(). И используйте strpos(), чтобы проверить, находится ли поисковая игла в строке и если не отобразится строка.

<?php 

    $search = $_GET["search"]; 
    $logfile = $_GET['logfile']; 
    $lines = file($logfile, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES); 

?> 

<head> 
    <title>Searching: <?php echo $search ?></title> 
</head> 

<?php 

    foreach($lines as $line) { 
     if(strpos($line, $search) === FALSE) { 
      echo "<font face='Arial'>$line</font><hr><p>";  
     } 
    } 

?> 
+0

Извините, я все новичок в работе с этим видом PHP. Но где это позволяет мне специально фильтровать «test.com» и просто не показывать всю строку и показывать остальное, что не содержит «test.com» – Codah3

+0

@ Codah3 Итак, теперь вы хотите отображать каждую строку, но просто удалить определенный текст в строке? ИЛИ вы хотите отображать строку только в том случае, если определенный текст не найден в строке? – Rizier123

+0

@ Codah3 Итак, где мы сейчас с этим вопросом? – Rizier123

0

Вам просто нужно изменить ваше состояние, если так:

if (stristr($line, $search) && strpos($line,'test.com') === false) 
0

Я полагаю, что вам нужно отфильтровать журналы в соответствии с определенным именем. Это кажется более сложным, чем поиск правильной функции php.

Итак, вы получили ваш запрос q: $search = $_GET['search'], который является именем пользователя.

У вас есть файл журнала: $file = fopen($logfile, 'r').

Обратите внимание: вы используете параметры GET для получения имени файла, но ваш пример ссылки http://test.com/?id=2022458&pid=41&user=Ser_Manji не содержит &logfile=logs.txt. Полагаю, вы знаете, что делаете.

Теперь, если ваша структура журналов {имя_пользователя} {действие}, то мы знаем, что «пространство» разбивает имя пользователя на его действие. Мы можем использовать взрыв: $clues = explode(' ', $line); и теперь $username = $clues[0] и $action = clues[1].

Так if ($username == $search) echo $action

Держите его простым и чистым.

$search = $_GET["search"]; 
$logfile = $_GET['logfile']; 
$file = fopen($logfile, "r"); 

while ($line = fgets($logfile)) { 
    $clues = explode(' ', $line); 
    $username = $clues[0]; 
    $action = $clues[1]; 
    if ($username == $search) { 
     echo $action; 
    } 
} 

Вы должны проверить это: http://test.com?search=user_1234&logfile=logs.txt, если вы ищете user_1234 внутри logs.txt файла и так далее ..

0

Если вы хотите, чтобы соответствовать тексту (чувствительно к регистру) только в начале линии, вы могли бы рассмотреть возможность использования нечувствительно к регистру и anchored регулярное выражение для фильтрации на текстовый файл в идеале с функцией preg_grep на массив (например, через file) или с FilterIterator на SplFileObject.

// regular expression pattern to match string at the 
// beginning of the line (^) case insensitive (i). 
$pattern = sprintf('~^%s~i', preg_quote($search_term, '~')); 

Для варианта массива:

$result = preg_grep($pattern, file($logfile)); 
foreach ($result as $line) { 
    ... // $line is each grep'ed (found) line 
} 

С итераторами это немного иначе:

$file = new SplFileObject($logfile); 
$filter = new RegexIterator($file, $pattern); 
foreach ($filter as $line) { 
    ... // $line is each filtered (found) line 
} 

Итераторам дать вам более объектно-ориентированный подход, массив чувствует, возможно, более прямым , Оба варианта работают с регулярными выражениями PCRE в PHP, который является стандартным диалектом регулярных выражений в PHP.

Смежные вопросы