ScotlandPHP

mb_ereg_replace

(PHP 4 >= 4.2.0, PHP 5, PHP 7)

mb_ereg_replaceÇok baytlı karakter destekli düzenli ifade yer değiştirmesi yapar

Açıklama

string mb_ereg_replace ( string $şablon , string $yeni , string $dizge [, string $seçenek = "msr" ] )

dizge içinde şablon eşleştirilmeye çalışılır, eşleşen parça yenisi ile değiştirilir.

Değiştirgeler

sablon

Düzenli ifade olarak şablon.

sablon içinde çok baytı karakterler kullanılabilir.

yeni

Yerleştirilecek metin.

dizge

İçinde şablonun aranacağı dizge.

seçenek
Eşleştirme koşulu seçenek değiştirgesi ile belirtilebilir. i belirtilmişse harf büyüklüğü dikkate alınmaz. x belirtilmişse boşluk karakterleri dikkate alınmaz. m belirtilmişse eşleşme çok satırlı kipte gerçekleştirilir ve '.' içine satırsonu karakteri dahil edilir. p belirtilmişse POSIX kipi etkin olur ve satırsonu karakteri normal karakter olarak ele alınır. e belirtilmişse yeni değiştirgesi bir PHP ifadesi olarak değerlendirilir.

Dönen Değerler

Başarı durumunda elde edilen dizgeyle aksi takdirde FALSE ile döner.

Notlar

Bilginize:

Bu işlev karakter kodlaması olarak dahili kodlamayı veya mb_regex_encoding() işlevi tarafından belirtilen karakter kodlamasını kullanır.

Uyarı

Güvenilmez girdilerle çalışırken e değiştiricisini asla kullanmayın. Özdevinimli önceleme yapılmayacaktır (preg_replace() işlevinde olduğu gibi). Bunu dikkate almazsanız, büyük olasılıkla uygulamanızda uzaktan kod çalıştırma açıkları oluşacaktır.

Ayrıca Bakınız

  • mb_regex_encoding() - mbregex işlevleri için geçerli kodlamayı dizge olarak döndürür
  • mb_eregi_replace() - Harf büyüklüğüne duyarsız çok baytlı karakter destekli düzenli ifade yer değiştirmesi yapar

add a note add a note

User Contributed Notes 15 notes

up
47
Pluche
6 years ago
Unlike preg_replace, mb_ereg_replace doesn't use separators

Exemple with preg_replace :
<?php $data = preg_replace("/[^A-Za-z0-9\.\-]/","",$data); ?>

Exemple with mb_ereg_replace :
<?php $data = mb_ereg_replace("[^A-Za-z0-9\.\-]","",$data); ?>
up
3
Anonymous
1 year ago
Pluche's comment should REALLY be added to the documentation, preferably under the "$pattern" param description. It is crucial to using this function.
up
12
daemoneye at gmail dot com
8 years ago
I got a pretty nasty error while trying to parse table rows(all contents were set to UTF-8) from the database for a dictionary project. The idea was to get all the rows from the first table (that is a table with bulgarian phrase in the first field, and its translation in english, french and german in the next fields). I needed to index all the bulgarian words that are found in the table to make an intelligent search. And that is where my headache started.

First of all, even with mb_strtolower() a lot of cyrillic characters went corrupted (ex: 'т,ъ,у,ф,б,г,з,ж,' etc...). After an hour of different attempts I got such a solution:

<?php

mb_internal_encoding
("UTF-8");
mb_regex_encoding("UTF-8");

$rows = $db->getRows();

$contents = array();
foreach (
$rows as $eachRow)
{
   
$cleared = str_replace($commonWords, ' ', mb_strtolower(stripslashes($eachRow['bulgarian']), 'UTF-8' ));
    if (
trim($cleared) != '') $contents[] = trim($cleared);
}   

$list = array();
foreach (
$contents as $eachRow)
{
   
$exploded = explode(' ', $eachRow);
    foreach (
$exploded as $eachExpl)
    {
       
$eachExpl = mb_ereg_replace('[^а-я ]',' ', $eachExpl);
        if (
trim($eachExpl) != '')
            if (!
in_array($eachExpl, $list, true))    $list[] = trim($eachExpl);
    }
}

?>

To work properly I got to set all the internal encoding settings to UTF-8. Else the default Latin-1 got half my database with missing characters.

I am posting this solution just in case someone has encountered a similar problem. Hope it helps you in case you need something like that.
up
3
trng
6 years ago
You can use \\n for capture group in replacement.
And you can NOT use $n notation (unlike preg_replace function).
up
3
keizo at gomo dot jp
9 years ago
<?php
$pattern
= "([あ-ん]+)[0-9]+";
$string = mb_ereg_replace($pattern, '「\\1」:\\0', $string);
?>

you can use \\n for capture group in replacement
up
0
Alexey Khrulev
1 month ago
If encoding of PHP script differs from encoding of string to be processed by mb_ereg_replace(), then you can't just write pattern in script. Both $pattern and $replacement must be converted to same encoding as string to be processed. In this example script is in UTF-8, file to be processed is in UTF-16LE encoding:

<?php
$file_encoding
= 'UTF-16LE';
mb_regex_encoding( $file_encoding );

$pattern     = "aaa";
$replacement = "AAA";
$pattern_encoded     = mb_convert_encoding( $pattern,     $file_encoding, 'UTF-8' );
$replacement_encoded = mb_convert_encoding( $replacement, $file_encoding, 'UTF-8' );

$result = mb_ereg_replace( $pattern_encoded, $replacement_encoded, file_get_contents('UTF-16LE.txt') );
file_put_contents('UTF-16LE-updated.txt', $result);
?>
up
0
ms2705335 at gmail dot com
3 months ago
As trng mentioned before you can use \\n for replacement but NOT \\\\n as mentioned in preg_replace docs. So string definition will be like:
$str = '\\1';
up
2
Anonymous
10 years ago
'i' option does not work correctly with multibyte characters. The function does not locate/replace the multibyte string if it's different case then specified on multibyte needle which is in different case.
up
-1
marco at thenetworksolution dot it
3 years ago
To selectively uppercase parts of a string via mb_eregi_replace

    $str = mb_eregi_replace('\b([0-9]{1,4}[a-z]{1,2})\b', "strtoupper
('\\1')", $str, 'e');

Full example, how to fix an address manually typed, uppercasing the first letter of a words and keeping uppercase roman numerals and the letters A,B,C after the house number):

function ucAddress($str) {
// first lowercase all and use the default ucwords
    $str = ucwords(strtolower($str));
// let's fix the default ucwords...
// uppercase letters after house number (was lowercased by the strtolower above)
    $str = mb_eregi_replace('\b([0-9]{1,4}[a-z]{1,2})\b', "strtoupper
('\\1')", $str, 'e');
// the same for roman numerals
    $str = mb_eregi_replace('\bM{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\b', "strtoupper('\\0')", $str, 'e');
    return $str;
}
up
0
gmx dot net at ulrich dot mierendorff
9 years ago
If you want to replace characters like "ä" or "ø" you can use mb_ereg_replace, but it is very slow. str_replace is much faster and also works with characters like "ä" or "ø"!

I think this has something to with the fact that str_replace works on byte level and does not care about characters.
I hope that can help.
up
0
squeegee
10 years ago
well, if you just calculated the length of the find and replace strings once instead of on every loop, it would likely speed it up a lot.
up
0
mpnicholas [@t] gmail (dot) com
11 years ago
Regarding the mb_str_ireplace() function: I benchmarked it against mb_eregi_replace() for single-character substitution, and it was significantly slower. Despite avoiding the ereg call, I think the while loop ends slowing you down too much for this to be practical.
up
0
vondrej(at)gmail(dot)com
11 years ago
Are you looking for htmlentities() for multibyte strings? This might help you - it just replace <, >, ", '

<?php
/**
*  Multibyte equivalent for htmlentities() [lite version :)]
*
* @param string $str
* @param string $encoding
* @return string
**/
function mb_htmlentities($str, $encoding = 'utf-8') {
   
mb_regex_encoding($encoding);
   
$pattern = array('<', '>', '"', '\'');
   
$replacement = array('&lt;', '&gt;', '&quot;', '&#39;');
    for (
$i=0; $i<sizeof($pattern); $i++) {
       
$str = mb_ereg_replace($pattern[$i], $replacement[$i], $str);
    }
    return
$str;
}
?>
up
0
faxe at neostrada dot pl
12 years ago
A simple mb_str_ireplace() implementation - a faster (?) replacement for non-regexp multi-byte string replacement:

<?php
function mb_str_ireplace($co, $naCo, $wCzym)
{
   
$wCzymM = mb_strtolower($wCzym);
   
$coM    = mb_strtolower($co);
   
$offset = 0;
   
        while(!
is_bool($poz = mb_strpos($wCzymM, $coM, $offset)))
    {
       
$offset = $poz + mb_strlen($naCo);
       
$wCzym = mb_substr($wCzym, 0, $poz). $naCo .mb_substr($wCzym, $poz+mb_strlen($co));
       
$wCzymM = mb_strtolower($wCzym);
    }
   
    return
$wCzym;
}
?>

[thiago - EDITOR NOTE: This function has improvements from d-okumura [aat] fi{dot}kyd[dot]co.jp]
up
-2
marco at thenetworksolution dot it
3 years ago
To selectively uppercase parts of a string via mb_eregi_replace

    $str = mb_eregi_replace('\b([0-9]{1,4}[a-z]{1,2})\b', "strtoupper
('\\1')", $str, 'e');

Full example, how to fix an address manually typed, uppercasing the first letter of a words and keeping uppercase roman numerals and the letters A,B,C after the house number):

function ucAddress($str) {
// first lowercase all and use the default ucwords
    $str = ucwords(strtolower($str));
// let's fix the default ucwords...
// uppercase letters after house number (was lowercased by the strtolower above)
    $str = mb_eregi_replace('\b([0-9]{1,4}[a-z]{1,2})\b', "strtoupper
('\\1')", $str, 'e');
// the same for roman numerals
    $str = mb_eregi_replace('\bM{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\b', "strtoupper('\\0')", $str, 'e');
    return $str;
}

Dr. Marco Marsala
Network Solution srl
http://www.realizzazionesitigenova.it
To Top