У меня есть php-код, который читает TXT-файл и отображает его содержимое.
Я хочу разрешить пользователю выполнять поиск по любому слову, которое он хочет, и, если оно доступно, система отобразит его с номером строки.
до сих пор я мог читать текст и отображать его.
я знаю, что мне нужно читать его построчно и хранить в переменной справа или там есть лучшие варианты?
<?php$myFile = "test.txt";
$myFileLink = fopen($myFile, 'r');
$myFileContents = fread($myFileLink, filesize($myFile));
while(!feof($myFileContents)) {
echo fgets($myFileContents) . "<br />";
}
if(isset($_POST["search"]))
{
$search =$_POST['name'];
$myFileContents = str_replace(["\r\n","\r"], "\n", $myFileContents);
if( preg_match_all('/('.preg_quote($search,'/').')/i', $myFileContents, $matches,PREG_OFFSET_CAPTURE))
{
foreach($matches[1] as $match)
{
$line = 1+substr_count(substr($myFileContents,0,$match[1]), "\n");
echo "Found $search on $line";
}
}
}fclose($myFileLink);
//echo $myFileContents;
?>
<html>
<head>
</head>
<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>
Что-то вроде этого
$myFileContents = file_get_contents($myFileLink);
if( preg_match_all('/('.preg_quote($search,'/').')/i', $myFileContents, $matches)){
print_r($matches);
}
Использование Preg соответствует всем, и регистр нечувствителен к регистру.
Получить номер строки гораздо сложнее, для этого вы захотите сделать что-то вроде этого:
$myFileContents = "Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.";
$search = "non proident";
//normalize line endings.
$myFileContents = str_replace(["\r\n","\r"], "\n", $myFileContents);
//Enter your code here, enjoy!
if( preg_match_all('/('.preg_quote($search,'/').')/i', $myFileContents, $matches,PREG_OFFSET_CAPTURE)){
foreach($matches[1] as $match){
$line = 1+substr_count(substr($myFileContents,0,$match[1]), "\n");
echo "Found $search on $line";
}
}
Выходы
Found non proident on 5
Вы можете видеть это живи здесь
Если это большой файл, вы можете выполнить подобный поиск, читая каждую строку. Что-то вроде этого
$myFileLink = fopen($myFile, 'r');
$line = 1;
while(!feof($myFileLink)) {
$myFileContents = fgets($myFileLink);
if( preg_match_all('/('.preg_quote($search,'/').')/i', $myFileContents, $matches)){
foreach($matches[1] as $match){
echo "Found $match on $line";
}
}
++$line;
}
Других решений пока нет …