2015-04-08 4 views
0

Я пытаюсь заставить PHP искать текстовый файл для строки. Я знаю, что строка существует в тексте, PHP может отображать весь текст, и все же strpos возвращает false. Вот мой код:PHP strpos() не работает

<?php 
    $pyscript = "testscript.py"; 
    //$path = "C:\\Users\\eneidhart\\Documents\\Python Scripts\\"; 
    $process_path = "C:\\Users\\eneidhart\\Documents\\ProcessList.txt"; 
    //$processcmd = "WMIC /OUTPUT: $process PROCESS get Caption,Commandline,Processid"; 
    $process_file = fopen($process_path, "r") or die("Unable to open file!"); 
    $processes = fread($process_file); 
    if (strpos($processes, $pyscript) !== FALSE) { 
     echo "$pyscript found"; 
    } elseif (strpos($processes, $pyscript) === FALSE) { 
     echo "$pyscript NOT found :("; 
    } else { 
     echo "UHHHHHHHH..."; 
    } 
    echo "<br />"; 
    while (!feof($process_file)) { 
     echo fgets($process_file)."<br />"; 
    } 
    fclose($processfile); 
    echo "End"; 
?> 

Цикл while напечатает каждую строку текстового файла, в том числе

python.exe      python testscript.py 

но strpos все еще не могу найти «testscript.py» в любом месте Это.
Конечная цель этого скрипта не обязательно читать этот текстовый файл, но для проверки того, выполняется ли в настоящий момент конкретный скрипт python. (Я работаю на Windows 7, кстати.) Текстовый файл был создан с помощью закомментирована $processcmd, и я попытался имея PHP вернуть вывод этой команды, как это:

$result = `$processcmd`; 

, но никакой ценности был возвращен. Кое-что о формате этого вывода, похоже, не согласуется с PHP, что объясняет, почему strpos не работает, но это единственная команда, которую я знаю о том, что покажет мне, какой скрипт python работает, а не просто показывает мне, что python .exe запущен. Есть ли способ получить этот текст для чтения или даже другой способ заставить PHP распознать, что работает скрипт python?

Заранее благодарен!

EDIT: Я думаю, что я нашел источник проблемы. Я создал свой собственный текстовый файл (test.txt), который содержал только строку, которую я искал, и использовал file_get_contents, как было предложено, и это сработало, хотя оно не работало для исходного текстового файла. Выясняется, что команда, указанная в разделе $processcmd, создает текстовый файл с кодировкой Unicode, а не ANSI (который был закодирован моим test.txt). Возможно ли, чтобы эта команда создала текстовый файл с другой кодировкой или даже проще, сообщила PHP, чтобы использовать Unicode, а не ANSI?

+1

По крайней мере, согласно [документации] (http://us.php.net/manual/en/function.fread.php), 'fread' требует второй аргумент (' length'). Возможно, вы хотите использовать ['file_get_contents'] (http://us.php.net/manual/en/function.file-get-contents.php) вместо этого? –

+0

Также есть предупреждение в php.net, например, в системах, которые различают двоичные и текстовые файлы (например, Windows), файл должен быть открыт с помощью «b», похоже, что вы находитесь на окнах, а ваш fopen использует только «r», rb " –

+0

Вы пытались' file_get_contents() 'или' file() '? Вы можете найти [это] (http://stackoverflow.com/a/24008078/4641017) полезным. –

ответ

0

Вы можете использовать функции preg_grep() и file():

$process_path = "C:\\Users\\eneidhart\\Documents\\ProcessList.txt"; 

$results = preg_grep('/\btestscript.py\b/', file($process_path));  
if(count($results)) { 
    echo "string was found"; 
} 
0

Вы должны следовать советам в первом комментарии и использовать:

file_get_contents($process_path); 

или

fread($process_file, filesize($process_path)); 

Если этого исправления недостаточно, и на самом деле проблема на strpos (wh Ich не должно быть), вы можете использовать:

preg_match("/.*testscript\.py.*/", $processes) 

NB: Действительно пытаются использовать StrPos и ​​не preg_match, как это не рекомендуется в документации.

0

Ну, я нашел ответ. Спасибо тем, кто предложил использовать file_get_contents(), так как я бы не получил здесь без этого совета. Оказывается, что WMIC выводит Unicode, а PHP не нравится читать это. Решение было другая команда, которая преобразует Unicode в ANSI:

cmd.exe /a /c TYPE unicode_file.txt > ansi_file.txt 

Я надеюсь, что это помогает, для тех из вас, пытаясь проверить, если конкретный питон скрипт работает, или если вы просто пытаетесь работать с WMIC.

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