2024 年 PHP Conference Japan

str_replace

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

str_replace將所有搜尋字串的出現次數取代為取代字串

說明

str_replace(
    陣列|字串 $search,
    陣列|字串 $replace,
    字串|陣列 $subject,
    整數 &$count = null
): 字串|陣列

這個函式會傳回一個字串或陣列,其中所有在 subject 中出現的 search 值都會被 replace 值取代。

如果要根據模式而不是固定字串來取代文字,請使用 preg_replace()

參數

如果 searchreplace 都是陣列,則 str_replace() 會從每個陣列中取出一個值,並使用它們在 subject 中進行搜尋和取代。如果 replace 的值比 search 少,則其餘的取代值會使用空字串。如果 search 是一個陣列而 replace 是一個字串,則這個取代字串會用於 search 的每個值。反之則沒有意義。

如果 searchreplace 是陣列,則它們的元素會從頭到尾依序處理。

search

要搜尋的值,也稱為「針」(needle)。可以使用陣列來指定多個搜尋值。

replace

取代找到的 search 值的取代值。可以使用陣列來指定多個取代值。

subject

要搜尋和取代的字串或陣列,也稱為「乾草堆」(haystack)。

如果 subject 是一個陣列,則會對 subject 的每個項目執行搜尋和取代,且傳回值也會是一個陣列。

count

如果傳入此參數,它將會被設定為執行的取代次數。

傳回值

此函式會傳回一個包含取代值的字串或陣列。

範例

範例 #1 基本的 str_replace() 範例

<?php
// 輸出:<body text='black'>
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");

// 輸出:Hll Wrld f PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");

// 輸出:You should eat pizza, beer, and ice cream every day
$phrase = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy = array("pizza", "beer", "ice cream");

$newphrase = str_replace($healthy, $yummy, $phrase);

// 輸出:2
$str = str_replace("ll", "", "good golly miss molly!", $count);
echo
$count;
?>

範例 #2 使用 str_replace() 時潛在陷阱的範例

<?php
// 取代的順序
$str = "Line 1\nLine 2\rLine 3\r\nLine 4\n";
$order = array("\r\n", "\n", "\r");
$replace = '<br />';

// 首先處理 \r\n,以免被重複轉換。
$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);

// 輸出:apearpearle pear
// 基於上述相同的原因
$letters = array('a', 'p');
$fruit = array('apple', 'pear');
$text = 'a p';
$output = str_replace($letters, $fruit, $text);
echo
$output;
?>

注意事項

注意此函式是二進位安全的。

警告

取代順序陷阱

因為 str_replace() 從左到右取代,所以在進行多個取代時,可能會取代先前插入的值。另請參閱本文中的範例。

注意事項:

此函式區分大小寫。使用 str_ireplace() 進行不區分大小寫的取代。

另請參閱

新增筆記

使用者貢獻的筆記 33 則筆記

nikolaz dot tang at hotmail dot com
14 年前
在多維陣列中替換字串的更快方法是使用 json_encode() 將其編碼,執行 str_replace(),然後再使用 json_decode() 將其解碼,如下所示:

<?php
function str_replace_json($search, $replace, $subject){
return
json_decode(str_replace($search, $replace, json_encode($subject)));

}
?>

這種方法比使用遞迴呼叫和迴圈方法快了將近 3 倍(在 10000 次執行中),而且程式碼簡潔了 10 倍。

與以下方法相比:

<?php
function str_replace_deep($search, $replace, $subject)
{
if (
is_array($subject))
{
foreach(
$subject as &$oneSubject)
$oneSubject = str_replace_deep($search, $replace, $oneSubject);
unset(
$oneSubject);
return
$subject;
} else {
return
str_replace($search, $replace, $subject);
}
}
?>
ressing1 at gmail dot com
3 年前
從字串 $b 中移除所有存在於字串 $a 中的字元

$a="ABC";
$b="teAsBtC";
echo str_replace(str_split($a),'',$b);

輸出:test

從字串 $b 中移除所有不存在於字串 $a 中的字元

$a="ABC";
$b="teAsBtC";
echo str_replace(str_split(str_replace(str_split($a),'',$b)),'',$b);

輸出:ABC
Alberto Lepe
15 年前
替換字元(或 FROM 和 TO 陣列中的重複模式)時要小心

例如

<?php
$arrFrom
= array("1","2","3","B");
$arrTo = array("A","B","C","D");
$word = "ZBB2";
echo
str_replace($arrFrom, $arrTo, $word);
?>

我預期的結果是:"ZDDB"
然而,它返回:"ZDDD"
(因為根據我們的陣列,B = D)

要讓它正常運作,請改用 "strtr"

<?php
$arr
= array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo
strtr($word,$arr);
?>

這會返回:"ZDDB"
moostende at gmail dot com
13 年前
請注意,這不會取代成為取代字串一部分的字串。當您想要多次連續移除同一個重複模式的多個實例時,這可能會是個問題。

如果您想從字串 '-aaa----b-c-----d--e---f' 中移除所有破折號,但保留一個, resulting in '-aaa-b-c-d-e-f',您不能使用 str_replace。請改用 preg_replace

<?php
$challenge
= '-aaa----b-c-----d--e---f';
echo
str_replace('--', '-', $challenge).'<br>';
echo
preg_replace('/--+/', '-', $challenge).'<br>';
?>

這會輸出以下內容
-aaa--b-c---d-e--f
-aaa-b-c-d-e-f
karst at onlinq dot nl
10 年前
「如果搜尋是一個陣列,而取代是一個字串,則此取代字串會用於搜尋的每個值。反之則沒有意義。」

我認為這裡完全忽略了一個重要的(而且一點也不抽象的)使用案例。以 PDO 處理參數取代的方式為例。

如果我們有以下查詢
「SELECT * FROM my_table WHERE (id = ? AND my_column = ? AND other_column = ?);」
「?」應該由 `$parameters` 陣列中的每個連續變數取代。這正是「搜尋」是值而「取代」是陣列的使用案例。

考慮到這不僅是一個真實世界的例子,也是 PHP 核心功能的一部分,我發現它在這裡被如此輕易地忽略非常奇怪。
Wes Foster
14 年前
您可以隨意使用 while/for 或其他任何方式來最佳化這段程式碼,但這是一小段允許您取代關聯陣列中找到的字串的程式碼。

例如
<?php
$replace
= array(
'dog' => 'cat',
'apple' => 'orange'
'chevy'
=> 'ford'
);

$string = 'I like to eat an apple with my dog in my chevy';

echo
str_replace_assoc($replace,$string);

// 輸出:I like to eat an orange with my cat in my ford
?>

以下是函式

<?php
function strReplaceAssoc(array $replace, $subject) {
return
str_replace(array_keys($replace), array_values($replace), $subject);
}
?>

[2010 年 6 月 1 日 - 由 thiago AT php DOT net 編輯:函式已由 ljelinek AT gmail DOT com 送出的更新版本取代]
viundan at gmail dot com
8 年前
決定避免「在執行多個替換時,可能會替換先前插入的值」的問題。另請參閱本文檔中的範例。

$urls - 我想用 <a> 標籤替換的網址陣列,網址可能相似
http://abc.com/parameter/
http://abc.com/

// 首先按長度排序,最長的優先
usort($urls,'sortByLen');

$replaces=[];

// 將所有網址替換為唯一值
foreach($urls as $url){
$replace = '__REPLACE' . uniqid() . '__';
$text = str_replace($url,$replace, $text);
$replaces[$replace] = '<a href="' . $url . '">' . $url . '</a>';
}

foreach($replaces as $key => $replace){
$text = str_replace($key,$replace, $text);
}

--------------

function sortByLen($a,$b){
return strlen($b)-strlen($a);
}

希望這對其他人有幫助
ravenswd at gmail dot com
6 年前
這就是當搜尋和取代陣列大小不同時會發生的情況

<?php
$search
= array('a', 'b', 'c', 'd', 'e');
$replace = array('A', 'B', 'C');
$subject = 'abcdefg';
echo
str_replace($search, $replace, $subject);
// 結果:'ABCfg'

$search = array('a', 'b', 'c');
$replace = array('A', 'B', 'C', 'D', 'E');
$subject = 'abcdefg';
echo
str_replace($search, $replace, $subject);
// 結果:'ABCdefg'
?>

在這兩種情況下都不會產生警告或錯誤。
michael dot moussa at gmail dot com
15 年前
正如之前的評論者所提到的,當 `$search` 包含在 `$replace` 中較早出現的值時,`str_replace` 會將這些先前的替換納入處理過程中,而不是僅對原始字串進行操作。這可能會產生意外的輸出。

範例

<?php
$search
= array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'ABCDE';

echo
str_replace($search, $replace, $subject); // 輸出:'FFFFFF'
?>

在上述程式碼中,`$search` 和 `$replace` 應該將 `$subject` 中的每個出現項替換為字母表中的下一個字母。此範例的預期輸出為 'BCDEF';然而,實際輸出為 'FFFFF'。

為了更清楚地說明這一點,請考慮以下範例

<?php
$search
= array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'A';

echo
str_replace($search, $replace, $subject); // 輸出:'F'
?>

由於 `$subject` 中只有字母 'A' 出現在 `$search` 陣列中,預期結果應該是 'B';然而,第 n 個替換操作並不是對 `$subject` 進行操作,而是對前 n-1 次替換完成後的 `$subject` 進行操作。

以下函式利用 `array_combine` 和 `strtr` 來產生預期的輸出,而且我相信這是執行所需的字串替換,且不讓先前的替換影響最終結果的最有效方法。

<?php
/**
* 使用 str_replace(...) 時,原始字串中不存在的值(但由之前的替換放入)將會被持續替換。這個字串替換函式旨在將
* $search 中的值替換為 $replace 中的值,同時不考慮先前的替換。請注意,此函式將
* 總是先尋找最長的可能匹配,然後再逐漸縮小到單個字元。
*
* "stro_replace" 中的 "o" 代表 "original"(原始),表示該函式僅對原始字串進行操作。
*
* @param array $search 需要被替換的字串或字元列表
* @param array $replace 將替換 $search 中相應值的字串或字元列表
* @param string $subject 正在執行此操作的字串
*
* @return string $search 陣列中所有子字串都被 $replace 陣列中的值替換後的 $subject
*/
function stro_replace($search, $replace, $subject)
{
return
strtr( $subject, array_combine($search, $replace) );
}

$search = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'ABCDE';

echo
stro_replace($search, $replace, $subject); // 輸出:'BCDEF'
?>

其他範例

<?php
$search
= array(' ', '&');
$replace = array('&nbsp;', '&amp;');
$subject = 'Hello & goodbye!';

// 我們想要將空格替換為 &nbsp; ,並且將 & 符號替換為 &amp;
echo str_replace($search, $replace, $subject); // 輸出: "Hello&amp;nbsp&amp;&amp;nbspgoodbye!" - 錯誤!

echo stro_replace($search, $replace, $subject); // 輸出: "Hello&nbsp;&amp;&nbsp;goodbye!" - 正確!

/*
注意:在命令列執行上述程式碼或在您的網路瀏覽器上檢視原始碼 - stro_replace 的替換字串是瀏覽器會解譯的 HTML 實體。
*/
?>

<?php
$search
= array('ERICA', 'AMERICA');
$replace = array('JON', 'PHP');
$subject = 'MIKE AND ERICA LIKE AMERICA';

// 我們想要將名稱 "ERICA" 替換為 "JON",並將單詞 "AMERICA" 替換為 "PHP"
echo str_replace($search, $replace, $subject); // 輸出: "MIKE AND JON LIKE AMJON",這是不正確的

echo stro_replace($search, $replace, $subject); // 輸出: "MIKE AND JON LIKE PHP",這是正確的
?>
mrrehbein at gmail dot com
9 年前
nikolaz dot tang at hotmail dot com 使用 json_encode/decode 的解決方案很有趣,但需要注意幾個問題。

<?php
// 來自: nikolaz dot tang at hotmail dot com 的文章
function str_replace_json($search, $replace, $subject){
return
json_decode(str_replace($search, $replace, json_encode($subject)));
}
?>

json_decode 會返回物件,而可能預期的是陣列。這可以透過在 json_decode 中加入第二個參數 'true' 來輕鬆解決。

$search 和 $replace 可能包含與 json 編碼相符的字串,這將會改變此方法返回的結構,或破壞 json。

例如
<?php
var_dump
(str_replace_json('":"', '","', ['this' => 'stuff']));
var_dump(str_replace_json('this":"', 'this" : "thing", "with":"', ['this' => 'stuff']));
?>
David Holt
8 年前
請注意,如果您使用這個函數來過濾和清理某些形式的使用者輸入,或移除字串的所有實例,則還需要注意另一個陷阱。

// 移除所有雙重字元
$string="1001011010";
$string=str_replace(array("11","00"),"",$string);
// 輸出: "110010"

$string="<ht<html>ml> 惡意程式碼 </<html>html> 等";
$string=str_replace(array("<html>","</html>"),"",$string);
// 輸出: "<html> 惡意程式碼 </html> 等"
apmuthu at usa dot net
14 年前
如果我們有一個 HTML 模板,其中包含需要在運行時替換的大括號中的佔位符,則以下函數將使用 str_replace 來完成此操作。

<?php

function parse_template($filename, $data) {
// 範例模板變數 {a} 和 {bc}
// 範例 $data 陣列
// $data = Array("a" => 'one', "bc" => 'two');
$q = file_get_contents($filename);
foreach (
$data as $key => $value) {
$q = str_replace('{'.$key.'}', $value, $q);
}
return
$q;
}

?>
jbarnett at jmbelite dot com
14 年前
可能值得一提的是,完成範例 2(潛在陷阱)的一個簡單方法是簡單地反向開始您的「替換」。

因此,不是從「A」開始到「E」結束,

<?php
$search
= array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
// 將 A 替換為 B,B 替換為 C,C 替換為 D,D 替換為 E,E 替換為 F(全部變成 F)
// 從 "E" 開始到 "A" 結束:

$search = array('E', 'D', 'C', 'B', 'A');
$replace = array('F', 'E', 'D', 'C', 'B');
// 將 E 替換為 F,D 替換為 E,C 替換為 D,B 替換為 C,A 替換為 B(防止
// 已替換的值被多次替換)
?>

基本上,從「最後」開始,並將替換內容按順序排列,使「已替換的值」不會等於「搜尋陣列」中稍後出現的值。
jay_knows_(all)uk at hotmail dot com
13 年前
這會去除惱人的 MS Word 特殊字元。

只要不斷微調,直到得到你需要的結果,你會看到我註釋掉了一些會造成我問題的部分。

可能還有一些需要添加的,但對於任何希望製作自己的自定義函式的人來說,這是一個起點。

<?php

function msword_conversion($str)
{
$str = str_replace(chr(130), ',', $str); // baseline single quote
$str = str_replace(chr(131), 'NLG', $str); // florin
$str = str_replace(chr(132), '"', $str); // baseline double quote
$str = str_replace(chr(133), '...', $str); // ellipsis
$str = str_replace(chr(134), '**', $str); // dagger (a second footnote)
$str = str_replace(chr(135), '***', $str); // double dagger (a third footnote)
$str = str_replace(chr(136), '^', $str); // circumflex accent
$str = str_replace(chr(137), 'o/oo', $str); // permile
$str = str_replace(chr(138), 'Sh', $str); // S Hacek
$str = str_replace(chr(139), '<', $str); // left single guillemet
// $str = str_replace(chr(140), 'OE', $str); // OE ligature
$str = str_replace(chr(145), "'", $str); // left single quote
$str = str_replace(chr(146), "'", $str); // right single quote
// $str = str_replace(chr(147), '"', $str); // left double quote
// $str = str_replace(chr(148), '"', $str); // right double quote
$str = str_replace(chr(149), '-', $str); // bullet
$str = str_replace(chr(150), '-–', $str); // endash
$str = str_replace(chr(151), '--', $str); // emdash
// $str = str_replace(chr(152), '~', $str); // tilde accent
// $str = str_replace(chr(153), '(TM)', $str); // trademark ligature
$str = str_replace(chr(154), 'sh', $str); // s Hacek
$str = str_replace(chr(155), '>', $str); // right single guillemet
// $str = str_replace(chr(156), 'oe', $str); // oe ligature
$str = str_replace(chr(159), 'Y', $str); // Y Dieresis
$str = str_replace('°C', '&deg;C', $str); // Celcius is used quite a lot so it makes sense to add this in
$str = str_replace('£', '&pound;', $str);
$str = str_replace("'", "'", $str);
$str = str_replace('"', '"', $str);
$str = str_replace('–', '&ndash;', $str);

return
$str;
}

?>
matt wheaton
18 年前
為了移除那些 Word 複製貼上產生的智慧型引號,我發現這適用於 UTF8 編碼的字串(以下範例中的 $text 為 UTF8)。此外,省略號、em dash 和 en dash 也會被替換。

在右雙引號 †之後有一個「隱形」字元,這裡似乎沒有顯示出來。它是 chr(157)。

<?php
$find
[] = '“'; // 左雙引號
$find[] = '”'; // 右雙引號
$find[] = '‘'; // 左單引號
$find[] = '’'; // 右單引號
$find[] = '…'; // 省略號
$find[] = '—'; // 長破折號 (em dash)
$find[] = '–'; // 短破折號 (en dash)

$replace[] = '"';
$replace[] = '"';
$replace[] = "'";
$replace[] = "'";
$replace[] = "...";
$replace[] = "-";
$replace[] = "-";

$text = str_replace($find, $replace, $text);
?>
pjcdawkins at googlemail dot com
14 年前
這裡有一個深度取代函式,允許在 `$search`、`$replace` 和 `$subject` 中使用多維陣列。`$subject` 的鍵值和其他結構將被保留。

<?php
// 輔助函式:
function _replaceWithAnything($search,$replace,$subject){
if(!
is_array($search) || !is_array($replace)){
$search=array($search);
$replace=array($replace);
}
$match=array_search($subject,$search,true);
if(
$match!==false && array_key_exists($match,$replace))
$subject=$replace[$match];
return
$subject;
}

// 主要函式:
function deepReplace($search,$replace,$subject){
if(!
is_array($subject))
return
_replaceWithAnything($search,$replace,$subject);
foreach(
$subject as &$val){
if(
is_array($val)){
$val=deepReplace($search,$replace,$val);
continue;
}
$val=_replaceWithAnything($search,$replace,$val);
}
return
$subject;
}
?>
Denzel Morris
12 年前
對於資深 PHP 程式設計師來說可能很明顯,但對於 PHP 新手來說卻並非如此,以下程式碼是無效的:
<?php
str_replace
($search, $replace, $subject, 1);
?>
乍看之下,這似乎是一個合理的要求,直到您意識到第四個參數必須是一個變數才能作為參考傳遞。 可以改成這樣:
<?php
str_replace
($search, $replace, $subject, $temp = 1);
// 或
$temp = 1;
str_replace($search, $replace, $subject, $temp);
?>
Ing. Mirko Plazotta
10 年前
<?php
// 使用單一陣列即可進行多重取代,非常簡潔
$replaceThis = Array(
'old word' => 'new word',
'was' => 'it',
'past' => 'future',
);

$originalText = "every old word was a thing of the past...";
$replacedText = str_replace(array_keys($replaceThis), $replaceThis, $originalText);
echo
$replacedText;
?>
Oyedele Hammed Horlah - itz dot harmid at gmail dot com
7 年前
這是一個簡單的函式,可以將所有換行符號替換為 <br> 標籤。

\r\n - Windows 換行符號
\n - Linux 換行符號
\r - Mac 換行符號

<?php
function nl_to_br($str) {
return
str_replace(array("\r\n","\n","\r"), "<br/>", $str);
}
echo
nl_to_br('Hello world\n I am Oyedele Hammed Horlah'); // => Hello World <br> I am Oyedele Hammed Horlah
?>

盡情使用
kriscraig at php dot net
12 年前
<?php

/**
* Convert foreign 8859-1 characters into HTML entities.
*
* @param string $str
* The string being parsed.
*
* @return string
* The converted string.
*/
public static function convert_chars_to_entities( $str )
{
$str = str_replace( 'À', '&#192;', $str );
$str = str_replace( 'Á', '&#193;', $str );
$str = str_replace( 'Â', '&#194;', $str );
$str = str_replace( 'Ã', '&#195;', $str );
$str = str_replace( 'Ä', '&#196;', $str );
$str = str_replace( 'Å', '&#197;', $str );
$str = str_replace( 'Æ', '&#198;', $str );
$str = str_replace( 'Ç', '&#199;', $str );
$str = str_replace( 'È', '&#200;', $str );
$str = str_replace( 'É', '&#201;', $str );
$str = str_replace( 'Ê', '&#202;', $str );
$str = str_replace( 'Ë', '&#203;', $str );
$str = str_replace( 'Ì', '&#204;', $str );
$str = str_replace( 'Í', '&#205;', $str );
$str = str_replace( 'Î', '&#206;', $str );
$str = str_replace( 'Ï', '&#207;', $str );
$str = str_replace( 'Ð', '&#208;', $str );
$str = str_replace( 'Ñ', '&#209;', $str );
$str = str_replace( 'Ò', '&#210;', $str );
$str = str_replace( 'Ó', '&#211;', $str );
$str = str_replace( 'Ô', '&#212;', $str );
$str = str_replace( 'Õ', '&#213;', $str );
$str = str_replace( 'Ö', '&#214;', $str );
$str = str_replace( '×', '&#215;', $str ); // Yeah, I know. But otherwise the gap is confusing. --Kris
$str = str_replace( 'Ø', '&#216;', $str );
$str = str_replace( 'Ù', '&#217;', $str );
$str = str_replace( 'Ú', '&#218;', $str );
$str = str_replace( 'Û', '&#219;', $str );
$str = str_replace( 'Ü', '&#220;', $str );
$str = str_replace( 'Ý', '&#221;', $str );
$str = str_replace( 'Þ', '&#222;', $str );
$str = str_replace( 'ß', '&#223;', $str );
$str = str_replace( 'à', '&#224;', $str );
$str = str_replace( 'á', '&#225;', $str );
$str = str_replace( 'â', '&#226;', $str );
$str = str_replace( 'ã', '&#227;', $str );
$str = str_replace( 'ä', '&#228;', $str );
$str = str_replace( 'å', '&#229;', $str );
$str = str_replace( 'æ', '&#230;', $str );
$str = str_replace( 'ç', '&#231;', $str );
$str = str_replace( 'è', '&#232;', $str );
$str = str_replace( 'é', '&#233;', $str );
$str = str_replace( 'ê', '&#234;', $str );
$str = str_replace( 'ë', '&#235;', $str );
$str = str_replace( 'ì', '&#236;', $str );
$str = str_replace( 'í', '&#237;', $str );
$str = str_replace( 'î', '&#238;', $str );
$str = str_replace( 'ï', '&#239;', $str );
$str = str_replace( 'ð', '&#240;', $str );
$str = str_replace( 'ñ', '&#241;', $str );
$str = str_replace( 'ò', '&#242;', $str );
$str = str_replace( 'ó', '&#243;', $str );
$str = str_replace( 'ô', '&#244;', $str );
$str = str_replace( 'õ', '&#245;', $str );
$str = str_replace( 'ö', '&#246;', $str );
$str = str_replace( '÷', '&#247;', $str ); // Yeah, I know. But otherwise the gap is confusing. --Kris
$str = str_replace( 'ø', '&#248;', $str );
$str = str_replace( 'ù', '&#249;', $str );
$str = str_replace( 'ú', '&#250;', $str );
$str = str_replace( 'û', '&#251;', $str );
$str = str_replace( 'ü', '&#252;', $str );
$str = str_replace( 'ý', '&#253;', $str );
$str = str_replace( 'þ', '&#254;', $str );
$str = str_replace( 'ÿ', '&#255;', $str );

return
$str;
}
?>
Mohsin Ali (puregenius02 at gmail dot com)
8 年前
$myString = “It was the best of mine it was the worst of mine,”;
// 顯示 “It was the best of bananas, it was the worst of bananas,”
echo str_replace( “mine”, “bananas”, $myString );
如果您想知道搜尋字串被取代了幾次,請傳入一個變數作為第四個選用參數。
函式執行後,此變數會儲存取代的次數
$myString = “It was the best of mine, it was the worst of mine,”;
// 顯示 “It was the best of bananas, it was the worst of bananas,”
echo str_replace( “mine”, “bananas”, $myString, $num ) . “ < br/ > ”;
// 顯示「文字已取代 2 次。」
echo “文字已取代 $num 次。 < br/ > ”;
mbullard at accuvista dot co dot uk
13 年前
在逗號後插入空格。

如果您有一個表單將結果以逗號分隔值的形式儲存在資料庫欄位中,當您顯示此資料時,可以使用以下方法在每個逗號後插入一個空格

<?php
$find
[] = ',';
$replace[] = '&#44;&nbsp;';
$text = str_replace($find, $replace, $row_rsRecordset['Field']);
print_r($text);
?>

注意事項
1) 為了避免替換順序造成的陷阱,逗號也被替換成其程式碼:&#44;
2) 你可以根據需求調整 $replace 的部分:將 &nbsp; 程式碼換成 <br/> 或將逗號和空格替換成 &nbsp;&middot;&nbsp; 等等。
jefrey at forteras dot tech
6 年前
絕對不要使用這個函式來防止 SQL 注入攻擊。

這聽起來很荒謬,但我看過幾個開發人員這樣做。

有趣的是,這些開發人員使用 str_replace(讓我們忽略他們甚至沒有使用不區分大小寫的 str_ireplace)從使用者輸入中移除常見的 SQL 命令,例如「SELECT」或「DROP」。

一個有趣的事情需要注意的是

<?php
$input
= "SELSELECTECT";
echo
str_replace("SELECT", null, $input); // = SELECT
?>

是的,你可以用迴圈,但 str_replace 從來就不是用來這樣做的。有一些正確的方法可以防止 SQL 注入,例如使用預備語句(佔位符)。
markem at sim1 dot us
10 年前
我當時正在使用 MySQL 並在網頁上顯示標題。我寫了一個腳本來確保單引號和雙引號從標題中移除。我使用了

$title = str_replace( "'", "", $title );

以及

$title = str_replace( '"', "", $title );

但單引號和雙引號仍然存在。所以我寫了一段程式碼,將每個字元用破折號分隔開來顯示。像這樣

for( $i=0; $i<strlen($title); $i++ ){
echo "$i-";
}

echo "<br>\n";

這顯示了

m-y-c-o-m-p-a-n-y- b-b-&-#-3-9-;-s

這讓我想到了「喔!我懂了。」

MySQL 函式 real_escape_string 將單引號修改為 &#39;,雙引號修改為 &#34;。這些在 HTML 下仍然顯示為單引號和雙引號,最重要的是 -

JAVASCRIPT 將 &#34; 和 &#39; 視為實際的單引號或雙引號。
引號。因此,如果你要將參數傳遞給函式,你
必須移除它們,否則在嘗試呼叫
給定函式時會出現錯誤。例如

<a href="javascript:func1('mycompany bbs&#39;s")'">

變成

<a href="javascript:func1('mycompany bbs's');">

這會產生錯誤,因為單引號字串中有一個單引號。然而,

$title = str_replace( "'", "", $title );

不會找到單引號。相反的,你必須這樣做

$title = str_replace( "&#39;", "'", $title );
以及
$title = str_relace( "&#34;", '"', $title );

(或者你可以直接移除它們。)

所以請記住!如果您嘗試移除單引號和雙引號,並且正在使用 MySQL 和 MySQL 的 real_escape_string() 函式,您可能會遇到仍然存在的單引號和雙引號,它們被定義為 &#39; 和 &#34;,但它們也會顯示為單引號和雙引號,並在您的 JavaScript 中造成問題。
flame2000 at mail dot ru
8 年前
取代多位元組字串中的字元。
例如,將 'f' 取代為 'b','o' 取代為 'e','t' 取代為 'r' 等等。

<?php
函數 mb_chars_replace($from, $to, $subj, $delSymb='_') {
$nsubj='';
preg_match_all('/(.)/u', $subj, $subj);$subj=$subj[1];
如果 (!is_array($from)) {preg_match_all('/(.)/u', $from, $from);$from=$from[1];}
如果 (!is_array($to)) {preg_match_all('/(.)/u', $to, $to);$to=$to[1];}
如果 (count($from)!==count($to)) 返回 false;

foreach($subj as $s) {
foreach($from as $k=>$f) {
如果($s===$f) {
$s=$to[$k];
跳出;
}
}
如果($s!==$delSymb) $nsubj.=$s;
}
返回 $nsubj;
}

//範例:

$from="fotber, ";
$to="berfot+_";

// 或

$from=array("f","o","t","b","e","r",","," ");
$to=array("b","e","r","f","o","t","+","_");

//輸出:
echo mb_chars_replace($from,$to,"foot, beer"); //beer+foot
?>
cc at cc dot com
12 年前
我找到了一個技術含量相當低的解決方案,可以避免這個「陷阱」,而不用擔心被取代項目的陣列順序。我無法輕易地「排序」替換陣列,因為它是從資料庫表格中讀取的。

無論如何,如果您在每個被取代的單字中添加一個可識別的標記,然後在最後將其過濾掉,就不會發現巢狀搜尋詞。我只是在將每個單字的第一個字元後動態添加 %%,然後再將其放入 str_ireplace 函式中。

$find = array("as1", "as2", "as3", "flex");
$replace = array("<a href = \"#as1\">A%%uto S%%entry R%%ev. A%%</a>", "<a href = \"#as2\">A%%uto S%%entry E%%xp</a>", "<a href = \"#as3\">A%%uto S%%entry f%%lex</a>", "<a style = \"color: red;\" href = \"#flex\">f%%lex</a>");
$text = str_ireplace($find, $replace, $text);
echo str_ireplace("%%", "", $text);

在這種情況下,我使用 %% 作為我的標記,因為這對我來說是一個不太可能的字元組合。
christof dot rieger at r-tron dot de
12 年前
在許多國家/地區,數字格式為 1.000,33,在英文中為 1,000.33

此函式始終將數字參數轉換為 PHP 確認的數字格式。如果數字字串中只有一個分隔符號,則將其解釋為小數點。

function dp($zahl)
{
if ((strpos($zahl,".") > "-1") | (strpos($zahl,",") > "-1")) {
if ((strpos($zahl,".") > "-1") & (strpos($zahl,",") > "-1")) {
if (strpos($zahl,".") > strpos($zahl,",")){
return str_replace(",","",$zahl);
} else {
return str_replace(",",".",str_replace(".","",$zahl));
}
} else {
if (strpos($zahl,".") > "-1") {
if (strpos($zahl,".") == strrpos($zahl,".")) {
return $zahl;
} else {
return str_replace(".","",$zahl);
}
} else {
if (strpos($zahl,",") == strrpos($zahl,",")) {
return str_replace(",",".",$zahl);
} else {
return str_replace(",","",$zahl);
}
} }
} else {
return $zahl;
} }
borasahin at gmail dot com
9 年前
JSON 土耳其文字問題 - (例如 PHP < 5.4)

<?php
function json_decode_tr($json){
$json_char = array("u00e7","u0131","u00fc","u011f","u00f6","u015f","u0130","u011e","u00dc","u00d6","u015e","u00c7");
$turkish = array("ç","ı","ü","ğ","ö","ş","İ","Ğ","Ü","Ö","Ş","Ç");
$result = str_replace($json_char, $turkish, $json);
return
json_decode($json);
}
?>
匿名
11 年前
@moostende at gmail dot com
如果您想從字串「-aaa----b-c-----d--e---f」中刪除除一個之外的所有破折號,使其變為「-aaa-b-c-d-e-f」,您可以使用 str_replace!

<?php
函式 foo($str)
{
do {
$str = str_replace("--", "-", $str, $count);
} while (
$count > 0);
return
$str;
}
echo
foo("-aaa----b-c-----d--e---f");
?>

這會輸出以下內容
-aaa-b-c-d-e-f
ASchmidt at Anamera dot net
6 年前
將包含控制字元、引號和反斜線的字串進行跳脫,以便後續在 MySQL 指令中使用。

MySQL 已記錄許多反斜線跳脫序列,需要使用這些序列在 SQL 指令中傳遞特定值:https://mysqldev.dev.org.tw/doc/refman/5.7/en/string-literals.html

在跳脫各種控制序列之前,先跳脫現有的反斜線至關重要,以防止重複跳脫。

<?php
$result
= str_replace(
array(
'\\', "\0", "\'", "\x8" /* 退格鍵 */, "\n", "\r", "\t", "\x1A" /* Ctrl+Z */ ),
array(
'\\\\', '\\0', '\\\'', '\\b', '\\n', '\\r', '\\t', '\\Z' ),
$value );
?>

這段程式碼並非用於防止 SQL 注入,而是用於在字串包含控制字元時正確地保留字串內容。
hyperzlib at outlook dot com
4 年前
使用 str_replace 從字串 '-aaa----b-c-----d--e---f' 中移除所有連續出現的破折號,只保留一個 (結果為:'-aaa-b-c-d-e-f')

<?php
$challenge
= '-aaa----b-c-----d--e---f';
do
$challenge = str_replace('--', '-', $challenge, $count); while($count);
echo
$challenge;
?>
christian dot reinecke at web dot de
14 年前
如果您需要在另一個字串中取代一個字串,但只取代一次,並且需要所有可能的組合(例如,在 "aba" 中將 "a" 取代為 "x" 以獲得陣列("xba", "abx")),您可以使用這個函式
<?php
function getSingleReplaceCombinations($replace, $with, $inHaystack)
{
$splits = explode($replace, $inHaystack);
$result = array();
for (
$i = 1, $ix = count($splits); $i < $ix; ++$i) {
$previous = array_slice($splits, 0, $i);
$next = array_slice($splits, $i);

$combine = array_pop($previous) . $with . array_shift($next);
$result[] = implode($replace, array_merge($previous, array($combine), $next));
}
return
$result;
}
var_dump(getSingleReplaceCombinations("a", "x", "aba")); // 結果如上所示
?>
這也許不是效能最佳的解決方案,但它可以運作。
vuabid at hotmail dot com
7 年前
當 `$search` 和 `$replace` 是陣列時,使用 `str_replace` 函式請考慮以下情況。

`$search = array( 'login_reactivate', 'login_reactivate_date' );`
`$replace = array( 'login reactivate status', 'login reactivate date' );`
`$subject = "fname, email, login_reactivate, login_reactivate_date";`

`$returnValue = str_replace( $search, $replace, $subject );`

`$returnValue` 的結果將會是
`fname, email, login reactivate status, login reactivate status_date`

您可以看到,我們預期 "login_reactivate_date" 會被替換為 "login reactivate date",但它實際上會被替換為 "login reactivate status_date"
To Top