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

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

Старт! Честный VDS/VPS, на котором «Лунная База» живет уже 20+ лет

Задумываетесь о том, чтобы поднять свой pet-проект, сайт клиента или настроить окружение для разработки? Уже пора подумать, где арендовать железо.

Лунная База хостится на FirstVDS более 20 лет. Мыслей о том, чтобы перебраться на другой хостинг, не было ни разу (хотя опыт работы с другими вариантами, конечно, есть).

Бывали разные ситуации, но они бывают на любом железе. Главное, что нужно понять: здесь нет маркетинговой шелухи и сказок про «мы всё сделаем за вас». Если вы берете VDS — вам дают полный root, возможность накатить любую ОС и не лезут в ваши конфиги.

Если в саппорт написать с вопросом по вашему коду и получить ответ: «Читайте документацию и разбирайтесь сами» или «Обратитесь к профильному специалисту» — это не повод обижаться. Это повод углубить свои знания в DevOps и сайтостроении! Бегите от тех, кто пообещает: «Мы всё чиним и настраиваем абсолютно бесплатно!». Никто никогда не работает «по доброте душевной» в ущерб себе, а бесплатный сыр в администрировании обычно заканчивается сломанной базой данных.

Что по факту: Гибкое масштабирование ядер и RAM, экономия по сравнению с физическими серверами и адекватная панель ispmanager, если она вам нужна.



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

<?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
)

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

Самый честный хостинг за 20+ лет существования Лунной Базы

Задумываешься о том, чтобы поднять свой сайт в Интернете? Уже пора подумать о том, какой хостинг выбрать?

Лунная База хостится 20+ лет на firstDVS. При этом, мыслей о том, чтобы перебраться на другой хостинг не было. (Но, при этом есть опыт работы с другими вариантами.)

Бывали с firstDVS разные ситуации, но, они бывают на всех хостингах. Единственное, что тут важно понять, - это то, что никто ничего тебе не будет впаривать... Но, и работать за тебя тоже никто не станет. Если в саппорт ответили: «Читайте по ссылке и разбирайтесь сами...» или вообще «Обратитесь за помощью к специалисту», - это повод углубить свои знания в области сайтостроения, а не бежать к тем, что пообещают: «Мы всё чиним и всё делаем за своих клиентов абсолютно бесплатно!» Никто никогда ничего ни за кого "по доброте душевной" не делал, не делает и не будет делать!

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