preg_replace

(PHP 4, PHP 5, PHP 7, PHP 8)

preg_replaceВыполняет поиск и замену по регулярному выражению

Описание

preg_replace(
    string|array $pattern,
    string|array $replacement,
    string|array $subject,
    int $limit = -1,
    int &$count = null
): string|array|null

Функция ищет в строке subject совпадения с шаблоном pattern и заменяет совпадения на значение replacement.

Вместо этой функции обращаются к функциям str_replace() или str_ireplace(), когда требуется найти соответствие точной строке, а не шаблону.

Список параметров

pattern

Искомый шаблон: строка или массив строк.

В шаблоне также указывают модификаторы модуля PCRE .

replacement

Строка или массив строк, в которых функция будет искать и заменять совпадения. Эта строка заменит каждую подстроку входной строки, которая совпала с шаблоном, если в этот параметр передали строку, а в параметр pattern — массив. Функция заменит каждую подстроку, которая совпала c шаблоном в массиве pattern, на значение replacement с тем же смещением внутреннего указателя массива, что и у шаблона, если и параметр pattern, и параметр replacement — массивы. Функция заменит на пустую строку каждую подстроку, которая совпала с лишним шаблоном в массиве pattern, если массив replacement содержит меньше элементов, чем массив pattern.

В параметре replacement разрешается указывать ссылки вида \n или $n, причём лучше предпочесть последний вариант. Каждую такую ссылку функция заменит на подстроку, которую захватил n-й подшаблон в круглых скобках. Номер группы n принимает значения от 0 до 99, причём ссылки \0 или $0 соответствует вхождению всего шаблона. Открывающие подшаблон скобки нумеруются слева направо, начиная с единицы, и указывают на номер подшаблона захвата. Обратите внимание, в отдельных ситуациях обратные слеши в строковых (string) литералах требуют экранирования.

Когда при работе с шаблоном замены за обратной ссылкой сразу идёт другое число (то есть буквальное число идёт сразу после подстроки, которая совпала с шаблоном), для ссылки на подшаблон нельзя использовать знакомую нотацию вида \1. Например, запись \11 собьёт функцию preg_replace() с толку, поскольку функция не знает, требуется ли выбрать первую обратную ссылку \1, за которой идёт буквальная цифра 1, или требуется выбрать одиннадцатую обратную ссылку \11, за которой ничего не идёт. Решение состоит в том, чтобы использовать конструкцию ${1}1, которая создаёт изолированную обратную ссылку $1, а число 1 оставляет литералом.

Если в шаблоне указали устаревший модификатор e, функция заэкранирует в строках, которыми замещаются обратные ссылки, отдельные символы: ', ", \ и NULL. Это сделали, чтобы гарантировать отсутствие синтаксических ошибок при записи обратных ссылок в одинарных или двойных кавычках: 'strlen(\'$1\')+strlen("$2")'. Знание синтаксиса записи строк в PHP помогает понять, как интерпретатор будет видеть строку.

subject

Строка или массив строк для поиска и замены.

Функция найдёт и заменит каждый элемент массива subject, а затем вернёт массив, если в параметр subject передали массив.

Функция сохранит ключи в массиве с результатами, если в параметр subject передали ассоциативный массив.

limit

Максимальное количество замен каждого шаблона для каждой строки subject. Значение по умолчанию равно -1 — не ограничивать количество замен.

count

Функция заполнит эту переменную количеством замен, которые она выполнила, если переменную указали.

Возвращаемые значения

Функция preg_replace() возвращает массив, если в параметр subject передали массив, иначе возвращается строка.

Функция возвращает новую версию значения subject, если нашла совпадения, иначе значение subject возвращается нетронутым. Функция возвращает null, если возникла ошибка.

Ошибки

Функция выдаёт ошибку уровня E_WARNING, когда в шаблоне указывают модификатор \e.

Если передали шаблон регулярного выражения, который не компилируется в допустимое регулярное выражение, выдаётся ошибка уровня E_WARNING.

Примеры

Пример #1 Пример обратных ссылок, за которыми следуют числовые литералы

<?php

$string
= 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo
preg_replace($pattern, $replacement, $string);

?>

Результат выполнения приведённого примера:

April1,2003

Пример #2 Пример обработки функцией preg_replace() индексных массивов

<?php

$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);

?>

Результат выполнения приведённого примера:

The bear black slow jumps over the lazy dog.

После сортировки шаблонов и замен по ключам получаем правильный результат:

<?php

ksort
($patterns);
ksort($replacements);
echo
preg_replace($patterns, $replacements, $string);

?>

Результат выполнения приведённого примера:

The slow black bear jumps over the lazy dog.

Пример #3 Пример замены ряда значений по набору шаблонов

<?php

$patterns
= array(
'/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
'/^\s*{(\w+)}\s*=/'
);

$replace = array('\3/\4/\1\2', '$\1 =');

echo
preg_replace($patterns, $replace, '{startDate} = 1999-5-27');

?>

Результат выполнения приведённого примера:

$startDate = 5/27/1999

Пример #4 Пример удаления пробелов

В этом примере функция удаляет из строки лишние пробелы.

<?php

$str
= 'foo o';
$str = preg_replace('/\s\s+/', ' ', $str);

// Теперь строка будет выглядеть вот так: 'foo o'
echo $str;

?>

Пример #5 Пример с параметром count

<?php

$count
= 0;

echo
preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count);
echo
$count; // 3

?>

Результат выполнения приведённого примера:

xp***to
3

Примечания

Замечание:

Функция обрабатывает ключи в том порядке, в котором ключи появляются в массиве, когда в параметры pattern и replacement передают массивы. Порядок ключей в этих массивах — не то же, что порядок числовых индексов. Если индексы требуются, чтобы определить, какой шаблон pattern требуется заменить какой заменой replacement, перед тем как вызывать функцию preg_replace(), на каждом массиве вызывают функцию ksort().

Замечание:

Функция применяет правила сопоставления последовательно, если и в параметр pattern, и в параметр replacement передали массив. То есть, вторая пара pattern/replacement будет работать со строкой, которую функция получила в результате обработки первой пары pattern/replacement, а не с исходной строкой. Когда требуется сымитировать параллельные замены, например, чтобы поменять два значения местами, один шаблон заменяют промежуточным заполнителем, а затем в следующей паре заменяют этот промежуточный заполнитель нужной заменой.

<?php

$p
= array('/a/', '/b/', '/c/');
$r = array('b', 'c', 'd');

print_r(preg_replace($p, $r, 'a'));
// Выводит: d

?>

Смотрите также

  • Регулярные выражения PCRE
  • preg_quote() - Экранирует символы в регулярных выражениях
  • preg_filter() - Производит поиск и замену по регулярному выражению
  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • preg_replace_callback() - Выполняет поиск по регулярному выражению и замену с использованием callback-функции
  • preg_split() - Разбивает строку по регулярному выражению
  • preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE
  • str_replace() - Заменяет вхождения строки поиска строкой замены

Добавить

Примечания пользователей 10 notes

up
783
arkani at iol dot pt
15 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
{n} Match exactly n times
{n,} Match at least n times
{n,m} 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)
up
5
Anonymous
9 months ago
You can only use numeric backreferences in the replacement string, but not named ones:
<?php
echo preg_replace('#(\d+)#', '\1 $1 ${1}', '123');
// 123 123 123
echo preg_replace('#(?<digits>\d+)#', '\digits $digits ${digits}', '123');
// \digits $digits ${digits}
?>

To use named backreferences, you have to use preg_replace_callback:
<?php
echo preg_replace_callback('#(?<digits>\d+)#', function( $m ){
return
"$m[1] $m[digits] {$m['digits']}";
},
'123');
// 123 123 123

echo preg_replace_callback('#(?<digits>\d+)#', fn($m) => "$m[1] $m[digits] {$m['digits']}", '123');
// 123 123 123
?>

See https://bugs.php.net/bug.php?id=81469
up
4
nik at rolls dot cc
11 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:

<?php
function expandCamelCase($source) {
return
preg_replace('/(?<!^)([A-Z][a-z]|(?<=[a-z])[^a-z]|(?<=[A-Z])[0-9_])/', ' $1', $source);
}
?>

Before:
ExpandCamelCaseAPIDescriptorPHP5_3_4Version3_21Beta
After:
Expand Camel Case API Descriptor PHP 5_3_4 Version 3_21 Beta
up
2
ismith at nojunk dot motorola dot com
17 years ago
Be aware that when using the "/u" modifier, if your input text contains any bad UTF-8 code sequences, then preg_replace will return an empty string, regardless of whether there were any matches.

This is due to the PCRE library returning an error code if the string contains bad UTF-8.
up
1
sternkinder at gmail dot com
17 years ago
From what I can see, the problem is, that if you go straight and substitute all 'A's wit 'T's you can't tell for sure which 'T's to substitute with 'A's afterwards. This can be for instance solved by simply replacing all 'A's by another character (for instance '_' or whatever you like), then replacing all 'T's by 'A's, and then replacing all '_'s (or whatever character you chose) by 'A's:

<?php
$dna
= "AGTCTGCCCTAG";
echo
str_replace(array("A","G","C","T","_","-"), array("_","-","G","A","T","C"), $dna); //output will be TCAGACGGGATC
?>

Although I don't know how transliteration in perl works (though I remember that is kind of similar to the UNIX command "tr") I would suggest following function for "switching" single chars:

<?php
function switch_chars($subject,$switch_table,$unused_char="_") {
foreach (
$switch_table as $_1 => $_2 ) {
$subject = str_replace($_1,$unused_char,$subject);
$subject = str_replace($_2,$_1,$subject);
$subject = str_replace($unused_char,$_2,$subject);
}
return
$subject;
}

echo
switch_chars("AGTCTGCCCTAG", array("A"=>"T","G"=>"C")); //output will be TCAGACGGGATC
?>
up
0
php-comments-REMOVE dot ME at dotancohen dot com
16 years ago
Below is a function for converting Hebrew final characters to their
normal equivelants should they appear in the middle of a word.
The /b argument does not treat Hebrew letters as part of a word,
so I had to work around that limitation.

<?php

$text
="עברית מבולגנת";

function
hebrewNotWordEndSwitch ($from, $to, $text) {
$text=
preg_replace('/'.$from.'([א-ת])/u','$2'.$to.'$1',$text);
return
$text;
}

do {
$text_before=$text;
$text=hebrewNotWordEndSwitch("ך","כ",$text);
$text=hebrewNotWordEndSwitch("ם","מ",$text);
$text=hebrewNotWordEndSwitch("ן","נ",$text);
$text=hebrewNotWordEndSwitch("ף","פ",$text);
$text=hebrewNotWordEndSwitch("ץ","צ",$text);
} while (
$text_before!=$text );

print
$text; // עברית מסודרת!

?>

The do-while is necessary for multiple instances of letters, such
as "אנני" which would start off as "אןןי". Note that there's still the
problem of acronyms with gershiim but that's not a difficult one
to solve. The code is in use at http://gibberish.co.il which you can
use to translate wrongly-encoded Hebrew, transliterize, and some
other Hebrew-related functions.

To ensure that there will be no regular characters at the end of a
word, just convert all regular characters to their final forms, then
run this function. Enjoy!
up
-2
bublifuk at mailinator dot com
6 years ago
A delimiter can be any ASCII non-alphanumeric, non-backslash, non-whitespace character: !"#$%&'*+,./:;=?@^_`|~- and ({[<>]})
up
-2
me at perochak dot com
13 years ago
If you would like to remove a tag along with the text inside it then use the following code.

<?php
preg_replace
('/(<tag>.+?)+(<\/tag>)/i', '', $string);
?>

example
<?php $string='<span class="normalprice">55 PKR</span>'; ?>

<?php
$string
= preg_replace('/(<span class="normalprice">.+?)+(<\/span>)/i', '', $string);
?>

This will results a null or empty string.

<?php
$string
='My String <span class="normalprice">55 PKR</span>';

$string = preg_replace('/(<span class="normalprice">.+?)+(<\/span>)/i', '', $string);
?>

This will results a " My String"
up
-1
razvan_bc at yahoo dot com
2 years ago
How to replace all comments inside code without remove crln = \r\n or cr \r each line?

<?php
$txt_target
=<<<t1
this;// dsdsds
nope

/*
ok
*/
is;huge
/*text bla*/
/*bla*/

t1;

/*
=======================================================================
expected result:
=======================================================================
this;
nope

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 '<hr><pre>';
echo
$txt_target;
echo
'</pre>';

// a single line '//' comments
$txt_target = preg_replace('![ \t]*//.*[ \t]*!', '', $txt_target);

// /* comment */
$txt_target = preg_replace('/\/\*([^\/]*)\*\/(\s+)/smi', '', $txt_target);
echo
'<hr><pre>';
echo
$txt_target;
echo
'</pre><hr>';

file_put_contents('to_check_with_a_hex_viewer.txt',$txt_target);

?>
up
-4
mail at johanvandemerwe dot nl
5 years ago
Sample for replacing bracketed short-codes

The used short-codes are purely used for educational purposes for they could be shorter as in 'italic' to 'i' or 'bold' to 'b'.

Sample text
----
This sample shows how to have [italic]italic[/italic], [bold]bold[/bold] and [underline]underlined[/underline] and [strikethrough]striked[/striketrhough] text.

with this function:

<?php
function textDecoration($html)
{
$patterns = [
'/\[(italic)\].*?\[\/\1\] ?/',
'/\[(bold)\].*?\[\/\1\] ?/',
'/\[(underline)\].*?\[\/\1\] ?/'
];

$replacements = [
'<i>$1</i>',
'<strong>$1</strong>',
'<u>$1</u>'
];

return
preg_replace($patterns, $replacements, $html);
}

$html = textDecoration($html);

echo
$html; // or return
?>

results in:
----
This sample shows how to have <i>italic</i>, <b>bold</b> and <u>underlined</u> and [strikethrough]striked[/striketrhough] text.

Notice!
There is no [strikethrough]striked[/striketrhough] fallback in the patterns and replacements array
To Top