Как найти и заменить строку в файле PHP?
Скорее всего Вы уже сталкивались с проблемой редактирования и считывания содержимого файла в PHP. Я хочу предложить решение данной проблемы. Не буду утверждать, что данный вариант самый короткий и лучший, однако проверен и работает!
Вставляем код в php-документ.
$yourfile = "index.php"; // можно любой файл, будь txt или htaccess
$oldstr = "Старый текст";
$newstr = "Новый текст";
$file = file($yourfile);
if (is_array($file))
<
foreach($file as $key => $value)
$file[$key]= preg_replace($oldstr, $newstr, $value);
>
>
else
exit ("Ошибка");
>
$fp = fopen($file, "w+"); // перезаписываем независимо от длины новой строки
fwrite($fp,implode("",$file));
fclose($fp);
echo "Строка успешно заменена";
В результате все совпадения содержимого переменной $oldstr в тексте файла $yourfile будет заменяться текстом из переменной $newstr, то есть все упоминания Старый текст заменятся на Новый текст. Всё достаточно просто! Если нужно обновлённую строку записать с новой строки, то не забываем \n в начале содержимого переменной:
$newstr = "\nСтала другая строка";
Можно также использовать функцию str_replace, однако preg_replace будет быстрее.
preg_replace
Выполняет поиск совпадений в строке subject с шаблоном pattern и заменяет их на replacement .
Для соответствия точной строке, а не шаблону, вместо этой функции используйте функцию str_replace() или str_ireplace() .
Список параметров
Искомый шаблон. Может быть как строкой, так и массивом строк.
Также доступны некоторые модификаторы PCRE.
Строка или массив строк для замены. Если этот параметр является строкой, а pattern является массивом, все шаблоны будут заменены этой строкой. Если и pattern и replacement являются массивами, каждый элемент pattern будет заменён соответствующим элементом из replacement . Если массив replacement содержит меньше элементов, чем массив pattern , то все лишние шаблоны из pattern будут заменены пустыми строками.
replacement может содержать ссылки вида \ n , либо $ n , причём последний вариант предпочтительней. Каждая такая ссылка будет заменена на подстроку, соответствующую n -ой подмаске. n может принимать значения от 0 до 99, причём ссылка \0 (либо $0 ) соответствует вхождению всего шаблона. Подмаски нумеруются слева направо, начиная с единицы. Обратите внимание, что обратные слеши в строке ( string ) литералы могут требовать экранирования.
При замене по шаблону с использованием ссылок на подмаски может возникнуть ситуация, когда непосредственно за маской следует цифра (например, установка цифры сразу после совпавшей маски). В таком случае нельзя использовать знакомую нотацию вида \1 для ссылки на подмаски. Запись, например, \11 , смутит preg_replace() , так как она не сможет понять, хотите ли вы использовать ссылку \1 , за которой следует цифра 1 или же вы хотите просто использовать ссылку \11 , за которой ничего не следует. Это недоразумение можно устранить, если воспользоваться конструкцией $1 , использующей изолированную ссылку $1 , и следующую за ней цифру 1 .
При использовании устаревшего модификатора e эта функция экранирует некоторые символы (а именно ‘ , » , \ и NULL) в строках, замещающих обратные ссылки. Это сделано для удостоверения корректности синтаксиса при использовании обратных ссылок внутри одинарных или двойных кавычек (например, ‘strlen(\’$1\’)+strlen(«$2»)’ ). Убедитесь, что вы владеете синтаксисом обработки строк PHP для того, чтобы точно осознавать, как будет выглядеть интерпретированная строка.
Строка или массив строк для поиска и замены.
Если subject является массивом, то поиск с заменой осуществляется для каждого элемента массива subject , а возвращаемое значение также будет являться массивом.
Если параметр subject является ассоциативным массивом, ключи будут сохранены в возвращаемом значении.
Максимально возможное количество замен каждого шаблона для каждой строки subject . По умолчанию равно -1 (без ограничений).
Если указана, то эта переменная будет заполнена количеством произведённых замен.
Возвращаемые значения
preg_replace() возвращает массив, если параметр subject является массивом, иначе возвращается строка.
Если найдены совпадения, возвращается новая версия subject , иначе subject возвращается нетронутым, в случае ошибки возвращается null .
Ошибки
Использование модификатора «\e» является ошибкой; в этом случае выдаётся ошибка уровня E_WARNING ;.
Если переданный шаблон регулярного выражения не компилируется в допустимое регулярное выражение, выдаётся ошибка уровня E_WARNING .
Примеры
Пример #1 Использование подмасок, за которыми следует цифра
$string = ‘April 15, 2003’ ;
$pattern = ‘/(\w+) (\d+), (\d+)/i’ ;
$replacement = ‘$1,$3’ ;
echo preg_replace ( $pattern , $replacement , $string );
?>?php
Результат выполнения приведённого примера:
April1,2003
Пример #2 Использование массивов с числовыми индексами в качестве аргументов функции preg_replace()
$string = ‘The quick brown fox jumps over the lazy dog.’ ;
$patterns = array();
$patterns [ 0 ] = ‘/quick/’ ;
$patterns [ 1 ] = ‘/brown/’ ;
$patterns [ 2 ] = ‘/fox/’ ;
$replacements = array();
$replacements [ 2 ] = ‘bear’ ;
$replacements [ 1 ] = ‘black’ ;
$replacements [ 0 ] = ‘slow’ ;
echo preg_replace ( $patterns , $replacements , $string );
?>?php
Результат выполнения приведённого примера:
The bear black slow jumps over the lazy dog.
Отсортировав по ключам шаблоны и замены, получаем желаемый результат:
ksort ( $patterns );
ksort ( $replacements );
echo preg_replace ( $patterns , $replacements , $string );
?>?php
Результат выполнения приведённого примера:
The slow black bear jumps over the lazy dog.
Пример #3 Замена по нескольким шаблонам
Результат выполнения приведённого примера:
$startDate = 5/27/1999
Пример #4 Чистка пробелов
Этот пример вычищает лишние пробелы в строке.
$str = ‘foo o’ ;
$str = preg_replace ( ‘/\s\s+/’ , ‘ ‘ , $str );
// Это теперь будет ‘foo o’
echo $str ;
?>?php
Пример #5 Использование параметра count
echo preg_replace (array( ‘/\d/’ , ‘/\s/’ ), ‘*’ , ‘xp 4 to’ , — 1 , $count );
echo $count ; //3
?>
Результат выполнения приведённого примера:
xp***to 3
Примечания
Замечание:
При использовании массивов в pattern и replacement , ключи обрабатываются в том порядке, в котором они находятся в массиве. Этот порядок не всегда совпадает с числовым порядком индексов. Если вы используете индексы для сопоставления друг с другом нужного pattern и replacement , то вам необходимо прогнать через функцию ksort() оба массива перед использованием preg_replace() .
Замечание:
Если и pattern и replacement являются массивами, правила соответствия будут действовать последовательно. То есть, вторая пара pattern / replacement будет работать со строкой, полученной в результате первой пары pattern / replacement , а не с исходной строкой. Если вы хотите имитировать замену, действующую параллельно, например, поменять местами два значения, замените один шаблон промежуточным заполнителем, а затем в последующей паре замените этот промежуточный заполнитель требуемой заменой.
$p = array( ‘/a/’ , ‘/b/’ , ‘/c/’ );
$r = array( ‘b’ , ‘c’ , ‘d’ );
print_r ( preg_replace ( $p , $r , ‘a’ ));
// prints d
?>?php
Смотрите также
- Регулярные выражения PCRE
- preg_quote() — Экранирует символы в регулярных выражениях
- preg_filter() — Производит поиск и замену по регулярному выражению
- preg_match() — Выполняет проверку на соответствие регулярному выражению
- preg_replace_callback() — Выполняет поиск по регулярному выражению и замену с использованием callback-функции
- preg_split() — Разбивает строку по регулярному выражению
- preg_last_error() — Возвращает код ошибки выполнения последнего регулярного выражения PCRE
- str_replace() — Заменяет все вхождения строки поиска на строку замены
User Contributed Notes 9 notes
14 years ago
Because i search a lot 4 this:
The following should be escaped if you are trying to match that character
Special Character Definitions
\ Quote the next metacharacter
^ Match the beginning of the line
. Match any character (except newline)
$ Match the end of the line (or before newline at the end)
| Alternation
() Grouping
[] Character class
* Match 0 or more times
+ Match 1 or more times
? Match 1 or 0 times
Match exactly n times
Match at least n times
Match at least n but not more than m times
More Special Character Stuff
\t tab (HT, TAB)
\n newline (LF, NL)
\r return (CR)
\f form feed (FF)
\a alarm (bell) (BEL)
\e escape (think troff) (ESC)
\033 octal char (think of a PDP-11)
\x1B hex char
\c[ control char
\l lowercase next char (think vi)
\u uppercase next char (think vi)
\L lowercase till \E (think vi)
\U uppercase till \E (think vi)
\E end case modification (think vi)
\Q quote (disable) pattern metacharacters till \E
Even More Special Characters
\w Match a «word» character (alphanumeric plus «_»)
\W Match a non-word character
\s Match a whitespace character
\S Match a non-whitespace character
\d Match a digit character
\D Match a non-digit character
\b Match a word boundary
\B Match a non-(word boundary)
\A Match only at beginning of string
\Z Match only at end of string, or before newline at the end
\z Match only at end of string
\G Match only where previous m//g left off (works only with /g)
10 years ago
To split Pascal/CamelCase into Title Case (for example, converting descriptive class names for use in human-readable frontends), you can use the below function:
function expandCamelCase ( $source ) return preg_replace ( ‘/(?>
?>
Before:
ExpandCamelCaseAPIDescriptorPHP5_3_4Version3_21Beta
After:
Expand Camel Case API Descriptor PHP 5_3_4 Version 3_21 Beta
12 years ago
If you would like to remove a tag along with the text inside it then use the following code.
$string = preg_replace ( ‘/(.+?)+()/i’ , » , $string );
?>
This will results a » My String»
1 year ago
How to replace all comments inside code without remove crln = \r\n or cr \r each line?
is;huge
=======================================================================
visualizing in a hex viewer .. to_check_with_a_hex_viewer.txt .
t h i s ; LF TAB n o p e CR LF CR LF i s ; h u g e CR LF
74 68 69 73 3b 0a 09 6e 6f 70 65 0d 0a 0d 0a 69 73 3b 68 75 67 65 0d 0a
I used F3 (viewer + options 3: hex) in mythical TOTAL COMMANDER!
=======================================================================
*/
echo ‘
' ;
echo $txt_target ;
echo '
‘ ;
// a single line ‘//’ comments
$txt_target = preg_replace ( ‘![ \t]*//.*[ \t]*!’ , » , $txt_target );
// /* comment */
$txt_target = preg_replace ( ‘/\/\*([^\/]*)\*\/(\s+)/smi’ , » , $txt_target );
echo ‘
' ;
echo $txt_target ;
echo '
‘ ;
file_put_contents ( ‘to_check_with_a_hex_viewer.txt’ , $txt_target );
Редактировать определенную строку в файле?
Как можно редактировать определенную строчку в файле? Там записан допустим 0, я получаю ноль с помощью $fil = @file($user); $count = $fil[5]; , теперь мне нужно удалить этот 0 и вместо него записать 1 в файл, т.е. увеличить значение на 1.
Отслеживать
задан 3 мая 2017 в 17:29
3,189 2 2 золотых знака 23 23 серебряных знака 45 45 бронзовых знаков
А как выглядит сома строка в файле ? Приводите больше и подробных данных
3 мая 2017 в 17:31
@VanyaAvchyan, просто 0. Больше ничего нет. На других строчках другие данные, поэтому полностью чистить файл нельзя.
3 мая 2017 в 17:36
Отредактируйте вопрос добавив последнюю информацию.я правильно понял : у вас в файле лежат строки разделённые enter(\r\n),и одна строка из них это число 0 ?
3 мая 2017 в 17:41
Если там только одна строка и только одна цифра в этой строке вам будет достаточно функций file_get_contents() и file_put_contents()
3 мая 2017 в 17:43
@VanyaAvchyan, да, строк порядка 100, разделённые \n, и 6 строка это 0. Вот ее нужно увеличивать на единицу при каждом вызове функции.
3 мая 2017 в 17:53
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Предположить у нас есть файл test.txt со следующими строками :
0 a b c d
PHP code:
file_put_contents( $file, $array ); // записываем обратно в файл > visitCounter(); ?>
Отслеживать
ответ дан 3 мая 2017 в 18:11
Vanya Avchyan Vanya Avchyan
4,950 1 1 золотой знак 17 17 серебряных знаков 42 42 бронзовых знака
Предполагаю, что вы знаете номер строки заранее.
index.php
filename.txt
строка0 0 строка2 строка3 строка4
Отслеживать
ответ дан 3 мая 2017 в 18:06
Hlib Ostrikov Hlib Ostrikov
501 3 3 серебряных знака 15 15 бронзовых знаков
Ничего не происходит когда запускаю файл с пхп кодом .А когда вместо
– user216109
3 мая 2017 в 18:32
@Sergey, Новые ошибки уровней E_WARNING и E_NOTICE были добавлены в php 7.1 при использовании некорректных строк с операторами, ожидающими числа (+ — * / ** % << >> | & ^) и их эквивалентами с присваиванием. Ошибка уровня E_NOTICE выдается, когда строка начинается с цифр, но далее содержит не цифровые символы, и ошибка уровня E_WARNING выдается тогда, когда строка вообще не содержит цифр. Так как ваша элемент массива с нулем на самом деле является строкой, где содержится 0 и перенос строки. Это всего лишь предупреждение, на работу скрипта оно не влияет.<>
PHP: str_replace — замена или удаление подстроки в строке
Функция str_replace в php нужна для замены подстроки в строке.
У функции следующие параметры:
$result = str_replace('что меняем', 'на что меняем', 'в чем меняем');
Замена подстроки
Пример: заменим bbb на zzz:
$str = 'aaa bbb ccc bbb ddd'; $result = str_replace('bbb', 'zzz', $str); echo $result; // результат: aaa zzz ccc zzz ddd
Мы заменили «bbb» на «zzz» и в $result запишется строка «aaa zzz ccc zzz ddd». У нас было 2 вхождения подстроки bbb и мы заменили их на zzz.
А что если нам нужно также заменить и ccc на zzz? Мы бы конечно могли запустить функцию 2 раза, в первый раз заменив первую подстроку, а второй раз другую, но можно просто указать массив подстрок поиска первым параметром.
Пример: заменим bbb и ccc на zzz:
$str = 'aaa bbb ccc bbb ddd'; $result = str_replace(['bbb', 'ccc'], 'zzz', $str); echo $result; // результат: aaa zzz zzz zzz ddd
Что если нам нужно заменить bbb на zzz, а ccc на www?
Мы конечно снова можем запустить функцию 2 раза, но оптимальнее с точки зрения производительности будет и вторым параметром передать массив. В первом массиве будут подстроки, которые мы ищем, а во втором те, на которые заменяем.
Пример: заменяем bbb на zzz, а ccc на www:
$str = 'aaa bbb ccc bbb ddd'; $result = str_replace(['bbb', 'ccc'], ['zzz', 'www'], $str); echo $result; // результат: aaa zzz www zzz ddd
Результат у нас правильный, но читабельность конечно страдает. А представьте если бы мы указывали сразу 50 таких строк для замены? И потом когда мы добавляем или заменяем строку, ее приходилось бы искать в 2 местах.
Более читабельным был бы код:
$str = 'aaa bbb ccc bbb ddd'; $replaces = [ 'bbb' => 'zzz', 'ccc' => 'www', ]; $result = str_replace(array_keys($replaces), array_values($replaces), $str); echo $result; // результат: aaa zzz www zzz ddd
Тут нам помогли функции array_keys и array_values которые вернули все ключи и все значения соответственно. Кстати для подобной замены вам не обязательно использовать функцию str_replace, а можно воспользоваться strtr, и тогда наш код выглядел бы еще более просто:
$str = 'aaa bbb ccc bbb ddd'; $result = strtr($str, [ 'bbb' => 'zzz', 'ccc' => 'www', ]); echo $result; // результат: aaa zzz www zzz ddd
У функции str_replace также есть четвертый параметр $count, в котором мы ничего не передаем, а наоборот получаем количество вхождений.
Таким образом если дополнить наш пример:
$str = 'aaa bbb ccc bbb ddd'; $result = str_replace('bbb', 'zzz', $str, $count); echo $result; // результат: aaa zzz ccc zzz ddd echo 'Вхождений: ' . $count; // Вхождений: 2
Удаление подстроки
Хоть это и очевидно, давайте проговорим еще момент с удалением строк. Чтобы удалить подстроку нужно просто заменить ее на пустоту (пустую строку).
Удалим xx из нашей строки:
str_replace('xx', '', 'aa xx bb'); // вторым параметром у нас идет пустая строка.
Другие примеры
Рассмотрим еще несколько примеров:
// Порядок замены $str = "Строка 1\nСтрока 2\rСтрока 3\r\nСтрока 4\n"; $order = array("\r\n", "\n", "\r"); $replace = '
'; // Обрабатывает сначала \r\n для избежания их повторной замены. echo $newstr = str_replace($order, $replace, $str); // Выводит F, т.к. A заменяется на B, затем B на C, и так далее. // В итоге E будет заменено F, так как замена происходит слева направо. $search = array('A', 'B', 'C', 'D', 'E'); $replace = array('B', 'C', 'D', 'E', 'F'); $subject = 'A'; echo str_replace($search, $replace, $subject); // Выводит: яблорехкорех орех (по вышеуказанной причине) $letters = array('я', 'о'); $fruit = array('яблоко', 'орех'); $text = 'я о'; $output = str_replace($letters, $fruit, $text); echo $output;
Эта функция не поддерживает регулярные выражения, но для этого есть другая функция: preg_replace()
Более мощная альтернатива: preg_replace
С помощью функции preg_replace вы можете осуществлять замену по регулярном выражению. Если вам не хватает возможностей str_replace, то обратите внимание на эту функцию.
Продвинутая работа со строками
Если вы часто работаете со строками, то возможно вам пригодятся более высокоуровневые методы для их обработки.
Взгляните как будут выглядеть поиск и замена строк с помощью symfony/string:
// checks if the string starts/ends with the given string u('https://symfony.com')->startsWith('https'); // true u('report-1234.pdf')->endsWith('.pdf'); // true // checks if the string contents are exactly the same as the given contents u('foo')->equalsTo('foo'); // true // checks if the string content match the given regular expression u('avatar-73647.png')->match('/avatar-(\d+)\.png/'); // result = ['avatar-73647.png', '73647'] // checks if the string contains any of the other given strings u('aeiou')->containsAny('a'); // true u('aeiou')->containsAny(['ab', 'efg']); // false u('aeiou')->containsAny(['eio', 'foo', 'z']); // true // finds the position of the first occurrence of the given string // (the second argument is the position where the search starts and negative // values have the same meaning as in PHP functions) u('abcdeabcde')->indexOf('c'); // 2 u('abcdeabcde')->indexOf('c', 2); // 2 u('abcdeabcde')->indexOf('c', -4); // 7 u('abcdeabcde')->indexOf('eab'); // 4 u('abcdeabcde')->indexOf('k'); // null // finds the position of the last occurrence of the given string // (the second argument is the position where the search starts and negative // values have the same meaning as in PHP functions) u('abcdeabcde')->indexOfLast('c'); // 7 u('abcdeabcde')->indexOfLast('c', 2); // 7 u('abcdeabcde')->indexOfLast('c', -4); // 2 u('abcdeabcde')->indexOfLast('eab'); // 4 u('abcdeabcde')->indexOfLast('k'); // null // replaces all occurrences of the given string u('http://symfony.com')->replace('http://', 'https://'); // 'https://symfony.com' // replaces all occurrences of the given regular expression u('(+1) 206-555-0100')->replaceMatches('/[^A-Za-z0-9]++/', ''); // '12065550100' // you can pass a callable as the second argument to perform advanced replacements u('123')->replaceMatches('/\d/', function ($match) < return '['.$match[0].']'; >); // result = '[1][2][3]'
Как видите здесь есть много полезных методов, для написания которых мы с вами могли бы потратить много времени. Посмотрите также другие полезные примеры работы с symfony/string
Свежие записи
- SQL UPDATE: примеры обновления строк в таблице
- PHP: substr и мощные альтернативы, чтобы вырезать часть строки
- Степень в C, C++ и С#: как возвести число в любую степень, побитовые операции
- Скачать ShowKeyPlus: ссылка на последнюю официальную версию, скачивание, установка
- Как создать файл в Linux: 12 способов
- SQL INSERT INTO: примеры вставки строк в таблицу БД MySQL
- PHP: str_replace — замена или удаление подстроки в строке
- Функция date() в php: распространенные форматы, примеры, советы
- cURL в PHP: примеры POST, GET запросов с headers, cookie, JSON и многопоточностью
- JSON в PHP: примеры json_encode, json_decode, работа с кириллицей и utf-8
- Файл gitignore — примеры и документация
- Сортировка массивов в php: ksort, asort и прочие sort’ы
- jQuery onclick: как выполнить код при клике на кнопку
- 500 Internal Server Error — в чем причина?
- SMTP от Yandex: как отправить письма из PHP — пример настроек
- No such file or directory — в чем причина?
- Как получить первый элемент массива в php
- Cтроку в массив по разделителю в PHP: explode, str_split, strtok — что выбрать?
- 301 редирект на https с www через htaccess
- Как в php добавить к массиву другой массив?
- 301 редирект на https без www с помощью htaccess
- Регулярные выражения в PHP
- PHP json_decode — как декодировать результат в массив?
- Yii2 ActiveRecord шпаргалка по составлению запросов
- Поиск подстроки в строке с помощью PHP
- Отправка почты на php
- Как подключить php код в html
- Конвертировать массив в строку при помощи PHP
- Подключение одного php файла в другой
- Подборка ссылок для веб-разработчика
- Проблема с кириллицей в PHPWord