PHP 8.1.31 Released!

preg_replace

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

preg_replaceDüzenli ifadeye göre dizgede değişiklik yapar

Açıklama

preg_replace(
    string|array $şablon,
    string|array $yenisi,
    string|array $konu,
    int $sınır = -1,
    int &$değişiklik_sayısı = null
): string|array|null

konu dizgesini şablon ile eşleştirmeye çalışır ve bulduklarını yenisi ile değiştirir.

Şablon yerine dizgenin kendisi eşleştirilmek istenirse, bu işlev yerine str_replace() veya str_ireplace() kullanılanılabilir.

Bağımsız Değişkenler

şablon

Aranacak şablon. Tek bir dizge olabileceği gibi çok sayıda dizge içeren bir dizi de olabilir.

Ayrıca, PCRE değiştircileri de kullanılabilir.

yenisi

Yer değiştirme için kullanılacak dizge veya dizi. Eğer bir dizge belirtilmişse ve şablon bir dizi ise dizideki şablonlarla eşleşen tüm parçalara bu dizge yerleştirilir. Her iki bağımsız değişkende de dizi belirtilmişse her şablon elemanı için kendine karşılık gelen yenisi elemanı yerleştirilir. Eğer yenisi dizisinde daha az eleman varsa, karşılığı olmayan şablon elemanları için boş dizge kullanılır.

yenisi bağımsız değişkeni \\n veya $n, biçiminde geriye gönderimler içerebilir. Genellikle ikinci biçem tarcih edilir. Böyle her geriye gönderim n'inci yaylı ayraçlı şablon grubuyla yakalanan metne karşılıktır. n 0 ve 99 dahil bu ikisi arasında herhangi bir sayı olabilir ve \0 veya $0 şablonun tamamıyla eşleşen dizgeye karşılık gelir. Açan yaylı ayraçlar ilki 1 olmak üzere soldan sağa doğru sayılarak bu sayılar yakalayan alt şablonların numaraları olurlar. yenisi bağımsız değişkeninde tersbölü kullanılacaksa bunların öncelenmesi gerekir Dizge içersinde yer alan tersbölülerin öncelenmesinin gerekebileceği unutulmamalıdır.

Bir yer değiştirme şablonu ile çalışırken, bir geriye gönderimin hemen ardından başka bir sayının gelmesi durumunda geriye gönderim için alışılagelen \1 gösterimini kullanamazsınız. Örneğin \11 için işlev sizin \1 geriye gönderiminden sonra 1 mi koyduğunuzu yoksa ardına hiçbir sayı konulmamış \11 geriye gönderimini mi belirttiğinizi bilemeyeceğinden işlev hata verecektir. Böyle bir durumda çözüm ${1}1 kullanmaktır. Böylece $1 geriye gönderimi ardından gelen 1 rakamından yalıtılmış olur.

Artık kullanımı önerilmeyen e değiştiricisi kullanılırken, bu işlev geriye gönderimlerle değiştirilen dizgelerdeki bazı karakterleri (', ", \ ve NULL karakterlerini) tersbölü ile önceler. Bunun böyle yapılmasının sebebi, tek veya çift tırnak içine alınmış geriye gönderimlerin ('strlen(\'$1\')+strlen("$2")' gibi) sözdizimi hatası vermesine engel olmaktır. PHP'nin dizgeleri nasıl yorumladığını anlayabilmek için PHP'nin dizge sözdizimini iyi bilmeniz gerekir.

konu

Şablonun aranacağı yer değiştirmeye konu dizge veya dizi.

Eğer konu bir dizge ise arama ve değiştirme her eleman için ayrı ayrı yapılır ve sonuçlar da bir dizi olarak döndürülür.

Eğer konu ilişkisel bir dizi ise dönen değerde anahtarlar korunacaktır.

sınır

Her konu dizgesinde her şablon için olası azami yer değiştirme sayısı. -1 öntanımlıdır (sınırsız).

değişiklik_sayısı

Belirtildiği takdirde yapılan yer değiştirmelerin sayısı bu bağımsız değişkene konur.

Dönen Değerler

konu bağımsız değişkeni bir dizi ise preg_replace() de bir dizi döndürür aksi takdirde bir dizge döner.

Eşleşmeler bulunduğu takdirde yeni konu döner, aksi takdirde bir hata oluşmamışsa konu değiştirilmeden döndürülür; bir hata oluşmuşsa null döner.

Hatalar/İstisnalar

"\e" değiştiricisini kullanmak hataya yol açar ve bir E_WARNING çıktılanır.

Düzenli ifade şablonu derlendiğinde geçerli bir düzenli ifade haline gelmezse bir E_WARNING çıktılanır.

Örnekler

Örnek 1 - Ardından bir sayı gelen geriye gönderim kullanımı

<?php
$dizge
= 'April 15, 2003';
$şablon = '/(\w+) (\d+), (\d+)/i';
$yenisi = '${1}1,$3';
echo
preg_replace($şablon, $yenisi, $dizge);
?>

Yukarıdaki örneğin çıktısı:

April1,2003

Örnek 2 - preg_replace() ile indisli dizi kullanımı

<?php
$dizge
= 'The quick brown fox jumps over the lazy dog.';
$sablonlar = array();
$sablonlar[0] = '/quick/';
$sablonlar[1] = '/brown/';
$sablonlar[2] = '/fox/';
$yeniler = array();
$yeniler[2] = 'bear';
$yeniler[1] = 'black';
$yeniler[0] = 'slow';
echo
preg_replace($sablonlar, $yeniler, $dizge);
?>

Yukarıdaki örneğin çıktısı:

The bear black slow jumps over the lazy dog.

Şablonlarla yenileri ksorting ile sıralarsak istediğimiz olur.

<?php
ksort
($sablonlar);
ksort($yeniler);
echo
preg_replace($sablonlar, $yeniler, $dizge);
?>

Yukarıdaki örneğin çıktısı:

The slow black bear jumped over the lazy dog.

Örnek 3 - Çeşitli değerlerin değiştirilmesi

<?php
$sablonlar
= array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
'/^\s*{(\w+)}\s*=/');
$yeniler = array ('\3/\4/\1\2', '$\1 =');
echo
preg_replace($sablonlar, $yeniler, '{startDate} = 1999-5-27');
?>

Yukarıdaki örneğin çıktısı:

$startDate = 5/27/1999

Örnek 4 - Boşluk ayıklama

Bu örnekte dizgedeki fazladan boşluklar temizlenmektedir.

<?php
$str
= 'foo o';
$str = preg_replace('/\s\s+/', ' ', $str);
// 'foo o' basılacak
echo $str;
?>

Örnek 5 - değişiklik_sayısı bağımsız değişkeninin kullanımı

<?php
$sayı
= 0;

echo
preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $sayı), "\n";
echo
$sayı; //3
?>

Yukarıdaki örneğin çıktısı:

xp***to
3

Notlar

Bilginize:

şablon ve yenisi bağımsız değişkenlerinde dizi kullanıldığında anahtarlar dizide yer aldıkları sırayla işlenirler. Bunun sayısal indis sırasında olması şart değildir. Hangi şablon'un yenisi'nin ne olacağını indis sırasına göre belirlemek isterseniz preg_replace() işlevini çağırmadan önce her iki diziyi de ksort() işlevinden geçirmelisiniz.

Bilginize:

şablon ve yenisi bağımsız değişkenlerinin ikisi de dizi ise eşleştirme kuralları sıralı uygulanır. Yani, ikinci şablon/yenisi çiftine uygulanacak dizge, birinci şablon/yenisi çiftinin sonucudur, özgün dizge değil. İki değeri takas etmek gibi paralel çalışan değiştirmeler yapılmak istenirse, bir şablonu bir ara yer tutucu ile değiştirip ardından daha sonraki bir çiftte bu aracı yer tutucu yenisi ile değiştirilebilir.

<?php
$p
= array('/a/', '/b/', '/c/');
$r = array('b', 'c', 'd');
print_r(preg_replace($p, $r, 'a'));
// d basar
?>

Ayrıca Bakınız

add a note

User Contributed Notes 10 notes

up
781
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
3
Anonymous
7 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
2
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
2
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
-1
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
-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
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