У меня есть код PHP, который читает несколько текстовых файлов и ищет запрос пользователя на слово, если слово существует, код будет отображать запрошенное слово с номером строки и именем файла.
код работает отлично, но проблема в номере строки, потому что система берет весь текстовый файл и объединяет его в один файл и продолжает считать номер строки.
я хочу, чтобы система запускалась с первой строки в каждом файле
пример :
слово محلي существует в 7 файлах в одной строке 13
система отображает это:
все же это слово существует во всех этих файлах в строке 13
<?php
$line = 1;
if(isset($_POST["search"]))
{
$search =$_POST['name'];
foreach(glob($_SERVER['DOCUMENT_ROOT']."/readfiletest/*.txt") as $txts)
{
$myFileLink = fopen($txts, 'r');
while(!feof($myFileLink))
{
$myFileContents = fgets($myFileLink);
if( preg_match_all('/('.preg_quote($search,'/').')/i', $myFileContents, $matches))
{
foreach($matches[1] as $match)
{
echo "the word $match exist on line [$line] in ";
}
echo basename ($txts) . "<br>".PHP_EOL;
//++$line;
}
++$line;
}fclose($myFileLink);
}
}
?><html>
<head>
</head>
<meta http-equiv="Content-Language" content="ar-sa">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<body>
<form action="index.php" method="post">
<p>enter your string <input type ="text" id = "idName" name="name" /></p>
<p><input type ="Submit" name ="search" value= "Search" /></p>
</form>
</body>
</html>
Измените свой код PHP на это. Надеюсь, это поможет.
<?php
$line = 1;
if(isset($_POST["search"]))
{
$search =$_POST['name'];
echo "the word $search exist on <br><br>";
foreach(glob($_SERVER['DOCUMENT_ROOT']."/readfiletest/*.txt") as $txts)
{
$myFileLink = fopen($txts, 'r');
while(!feof($myFileLink))
{
$files[] = basename($txts);
$myFileContents = fgets($myFileLink);
if( preg_match_all('/('.preg_quote($search,'/').')/i', $myFileContents, $matches))
{
foreach($matches[1] as $match)
{
//echo "line [$line] in ";
$lines[str_replace(" ", "_", basename($txts))][] = $line;
}
//echo basename($txts) . "<br>".PHP_EOL;
}
++$line;
}
fclose($myFileLink);
}
}
?>
и в теле добавить это
<?php if(isset($_POST["search"]) && !empty($files)): ?>
<table border="1">
<thead>
<tr>
<td>File Name</td>
<td>Line No.</td>
</tr>
</thead>
<tbody>
<tr>
<?php foreach ($files as $name): ?>
<td><?= $name; ?></td>
<td><?= implode(', ', $lines[str_replace(" ", "_", $name)]); ?></td>
<?php endforeach ?>
</tr>
</tbody>
</table>
<?php endif; ?>
Других решений пока нет …