Задача нахождения заданной подстроки в текстовом массиве может быть решена многими способами. В этой статье рассмотрим, как в заданном файле найти строки, в которых есть совпадение с подстрокой, которую мы зададим. Для этого нам нужно будет прочитать весь файл строку за строкой и проверить соответствие этих строк на соответствие их заданному значению, передаваемому в виде строковой переменной, которая служит образцом для сравнения.
Для того, чтобы в будущем было удобнее использовать написанный код, оформим его в виде функции, принимающей в качестве входных данных имя файла и подстроки (образца для сравнения). Сразу приведу листинг программы, после этого разберу построчно, что и как работает, а также почему выбрано именно данное решение:
<?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
)
Программа рабочая и её можно сразу использовать и расширять, наращивая функционал того, что требуется сделать, если в файле найдено совпадение с найденной подстрокой.
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)