यहाँ मेरी कार्यान्वयन, Alain's answer बंद आधारित है:
/**
* Replace all occurrences of the search string with the replacement string. Multibyte safe.
*
* @param string|array $search The value being searched for, otherwise known as the needle. An array may be used to designate multiple needles.
* @param string|array $replace The replacement value that replaces found search values. An array may be used to designate multiple replacements.
* @param string|array $subject The string or array being searched and replaced on, otherwise known as the haystack.
* If subject is an array, then the search and replace is performed with every entry of subject, and the return value is an array as well.
* @param string $encoding The encoding parameter is the character encoding. If it is omitted, the internal character encoding value will be used.
* @param int $count If passed, this will be set to the number of replacements performed.
* @return array|string
*/
public static function mbReplace($search, $replace, $subject, $encoding = 'auto', &$count=0) {
if(!is_array($subject)) {
$searches = is_array($search) ? array_values($search) : [$search];
$replacements = is_array($replace) ? array_values($replace) : [$replace];
$replacements = array_pad($replacements, count($searches), '');
foreach($searches as $key => $search) {
$replace = $replacements[$key];
$search_len = mb_strlen($search, $encoding);
$sb = [];
while(($offset = mb_strpos($subject, $search, 0, $encoding)) !== false) {
$sb[] = mb_substr($subject, 0, $offset, $encoding);
$subject = mb_substr($subject, $offset + $search_len, null, $encoding);
++$count;
}
$sb[] = $subject;
$subject = implode($replace, $sb);
}
} else {
foreach($subject as $key => $value) {
$subject[$key] = self::mbReplace($search, $replace, $value, $encoding, $count);
}
}
return $subject;
}
उनकी एक वर्ण एन्कोडिंग को स्वीकार नहीं करता है, हालांकि मैं तुम्हें mb_regex_encoding
के माध्यम से यह निर्धारित कर सकते हैं लगता है।
मेरे इकाई परीक्षण पास:
function testMbReplace() {
$this->assertSame('bbb',Str::mbReplace('a','b','aaa','auto',$count1));
$this->assertSame(3,$count1);
$this->assertSame('ccc',Str::mbReplace(['a','b'],['b','c'],'aaa','auto',$count2));
$this->assertSame(6,$count2);
$this->assertSame("\xbf\x5c\x27",Str::mbReplace("\x27","\x5c\x27","\xbf\x27",'iso-8859-1'));
$this->assertSame("\xbf\x27",Str::mbReplace("\x27","\x5c\x27","\xbf\x27",'gbk'));
}
आप और अधिक जानकारी देने के लिए की जरूरत है। प्रतिस्थापन स्ट्रिंग और विषय के एन्कोडिंग क्या है? यदि विषय यूटीएफ -8 है और प्रतिस्थापन स्ट्रिंग ASCII रेंज में है, तो आप 'str_replace' का उपयोग कर सकते हैं। – Artefacto
यूनिकोड के आसपास रहा है, क्या, 15 साल अब? अभी भी एक कोर आंतरिक पाश में एमबी तारों के साथ mucking? अंदर से काम करते हैं। –