Как найти стоки с нужной подстрокой в файле с помощью PHP

Задача нахождения заданной подстроки в текстовом массиве может быть решена многими способами. В этой статье рассмотрим, как в заданном файле найти строки, в которых есть совпадение с подстрокой, которую мы зададим. Для этого нам нужно будет прочитать весь файл строку за строкой и проверить соответствие этих строк на соответствие их заданному значению, передаваемому в виде строковой переменной, которая служит образцом для сравнения.



Для того, чтобы в будущем было удобнее использовать написанный код, оформим его в виде функции, принимающей в качестве входных данных имя файла и подстроки (образца для сравнения). Сразу приведу листинг программы, после этого разберу построчно, что и как работает, а также почему выбрано именно данное решение:

<?php
$filename = '.htaccess'; // имя файла
$keyline  = 'Order'; // строка, совпадение с которой нужно найти
echo '<pre>';
print_r(search_line($filename, $keyline));
echo '</pre>';

function search_line ($file_name, $key_line) {
	$f = fopen ($file_name, "rt");
	$lines = explode ("\n", fread ($f, filesize($file_name)));
	foreach ($lines as $line_num => $line) {
		$line_num++;
		if (strripos($line, $key_line) !== false) {
			$resultline[$line_num+1] =  $line;
		}
	}
	return $resultline;
}
?>

Итак, в строке 2 задаём имя файла, с которым будем работать: $filename = '.htaccess';

В строке 3 — строковую переменную, вхождение которой будем проверять строки данного файла: $keyline  = 'Order';

В строках 4..6 содержится вывод работы функции нахождения строк. Так как функция передаёт эту информацию в виде массива (мне так показалось удобнее), то используем уже найденное решение того, как вывести на экран массив php со значениями всех его элементов с помощью функции print_r, которое подробно описано в → этой статье.

Сама функция поиска вхождения подстроки в строки файла находится в строчках 8..18 приведённого выше кода.

Строка 8 — задаём имя функции и передаваемые ей аргументы (имя файла и подстроку для поиска): function search_line ($file_name, $key_line) {

9..10 строки:

  • открываем файл на чтение с параметром rt для удаления всех символов перевода строк, которые могут остаться после текстовых редакторов Windows
    • $f = fopen ($file_name, "rt");
  • с помощью функции explode удаляем во всех прочитанных строках переводы строк \n
    • $lines = explode ("\n", fread ($f, filesize($file_name)));

Именно это решение описано в одной толстой книжке по php и рекомендуется для использования, как более быстрое, чем использование функции file(). Раз то, то почему бы им не пользоваться? ;)

В строке 11 запускаем построчный обход полученного из файла массива строк $lines, передавая в переменную $line_num номер строки, который будет увеличиваться на 1 при переходе к следующей строке, а в переменную $line собственно саму читаемую строку: foreach ($lines as $line_num => $line) {

В строке 12 увеличиваем значение номера читаемой строки: $line_num++;

Таким образом у нас есть всё: номер строки и сама строка из файла. Осталось проверить вхождение заданной подстроки в эту строку. Именно это и делаем в строке 13 if (strripos($line, $key_line) !== false) { с помощью функции strripos(), то есть без учёта регистра символов в этой строке. Если нужно проверять строки с учётом регистра (заглавные и строчные), нужно вместо неё использовать функцию strpos().

В этом месте я так и не понял, потратив пару часов времени на отладку:
Простое условие if (strripos($line, $key_line)) по какой-то причине не срабатывает, если вхождение подстроки начинается с начала строки и только при явной проверке  !== false, всё работает как нужно. Разбираться, почему именно так, сейчас лень. =)

После того, как найдено вхождение в строку из файла, сохраняем это значение в 14-й строке как элемент двухмерного массива. Первый ключ - это номер строки, второй - собственно сама строка: $resultline[$line_num+1] = $line;

После того, как все строки файла пройдены и проверены, передаём результат выполнения данной функции в 17-й строке: return $resultline;

Вот собственно и всё!

Результатом выполнения данной программы будет вывод массива с номерами строк и самими строками, которые совпадают с заданной подстрокой из указанного файла:

Array
(
    [83] => #Order allow,deny
    [89] => Order allow,deny
)

Программа рабочая и её можно сразу использовать и расширять, наращивая функционал того, что требуется сделать, если в файле найдено совпадение с найденной подстрокой.

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню