Что мне нужно сделать, это найти конкретный уникальный номер в тексте, который может возникать несколько раз в документе. Мне нужно отобразить все связанные с ним линии и все вхождения. Если вы проверите образец файла, вы увидите, что общий разделитель равен ===. Поэтому я подумывал использовать какое-то регулярное выражение, которое будет проверять искомый номер и отображать все строки между двумя ===. И с помощью preg_match запустите поиск по файлу. На данный момент я не знаю, как писать регулярные выражения, вы можете помочь мне с этим?PHP, как искать файл для определенной переменной и отображать все связанные с ним строки - см. Подробности
Файл просто:
=======================================================
= Elapsed: yxz ms
= In msg: <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><BLRequest xmlns="http://www.wwww.ww/wwww/"> *** <find_me>12345678901</find_me> *** </BLRequest></soapenv:Body></soapenv:Envelope>
= Out msg: <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Body xmlns:envelope="http://schemas.xmlsoap.org/soap/envelope/" envelope:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> *** </Body></Envelope>
=======================================================
=======================================================
= Elapsed: yxz ms
= In msg: <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><BLRequest xmlns="http://www.wwww.ww/wwww/"> *** <find_me>6545678901</find_me> *** </BLRequest></soapenv:Body></soapenv:Envelope>
= Out msg: <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Body xmlns:envelope="http://schemas.xmlsoap.org/soap/envelope/" envelope:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> *** </Body></Envelope>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http " > *** </SOAP-ENV:Envelope>
=======================================================
=======================================================
= Elapsed: yxz ms
= In msg: <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><BLRequest xmlns="http://www.wwww.ww/wwww/"> *** <find_me>12345678901</find_me> *** </BLRequest></soapenv:Body></soapenv:Envelope>
= Out msg: <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Body xmlns:envelope="http://schemas.xmlsoap.org/soap/envelope/" envelope:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> *** </Body></Envelope>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http " > *** </SOAP-ENV:Envelope>
=======================================================
Также я написал код, в котором должны быть это регулярное выражение будет вставлено, это нормально или есть лучший способ сделать это?
<?php
$file ='myFile.log';
$search = '12345678901'; //find_me
$pattern = '/(?<========================================================).*?(?========================================================)/s';
$file = fopen($file, "r") or die("Cannot open file!\n");
while ($line = fgets($file, 1024)) {
if (preg_match($pattern, $line)) {
echo "Results:</br> " . $line;
} else {
echo "No match: " . $line;
}
}
fclose($file);
?>
Обратите внимание, что: файл может быть до 200Мб. Текущий RE некорректен, это одна из моих попыток Кроме того, можно ли отображать результаты как xml? поскольку в файле есть xml строки?
Do 'strpos ($ line, $ search)! == false' вместо' preg_match ($ pattern, $ line) 'и' возможно отображать результаты как xml' конечно, но это больше работает :-) – JustOnUnderMillions
I была эта попытка, но она отображает только строку, где найден результат. 'while (! feof ($ fp)) { \t \t \t $ line = fgets ($ fp); \t \t \t если (! (StrPos ($ строка, $ игла) === ложь)) { \t \t \t \t \t \t \t \t \t эхо 'Найдено'. $ игла. ' в очереди #' . $ line_number. \t \t \t echo ' В этой строке содержатся:'. nl2br ($ строка); \t \t \t} ' – strumpf