PHP Conference Japan 2024

str_ireplace

(PHP 5, PHP 7, PHP 8)

str_ireplacestr_replace() 的大小寫不敏感版本

說明

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

此函式會傳回一個字串或陣列,其中所有在 subject 中出現的 search(忽略大小寫)都已替換為指定的 replace 值。

要根據模式而不是固定字串來替換文字,請使用 preg_replace() 搭配 i 模式修飾符

參數

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

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

search

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

replace

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

subject

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

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

count

如果傳入此參數,它將被設定為執行的替換次數。

傳回值

傳回一個字串或一個替換值的陣列。

更新日誌

版本 說明
8.2.0 大小寫轉換不再取決於使用 setlocale() 設定的地區設定。只會進行 ASCII 大小寫轉換。非 ASCII 位元組將按其位元組值進行比較。

範例

範例 #1 str_ireplace() 範例

<?php
$bodytag
= str_ireplace("%body%", "black", "<body text=%BODY%>");
echo
$bodytag; // <body text=black>
?>

注意事項

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

警告

替換順序陷阱

由於 str_ireplace() 是由左至右替換,因此在進行多重替換時,可能會替換掉先前已插入的值。在 str_replace() 文件中的範例 #2 示範了這在實務上可能如何影響您。

另請參閱

新增註解

使用者貢獻的註解 11 則註解

Tom
7 個月前
注意!str_ireplace 不會破壞多位元組字元。但多位元組字元不會區分大小寫地被替換。

<?php
echo str_ireplace('Ä', 'Ae_', 'Ägypten'); // Ae_gypten
echo str_ireplace('ä', 'ae_', 'ägypten'); // ae_gypten
echo str_ireplace('ä', 'ae_', 'Ägypten'); // Ägypten
echo str_ireplace('Ä', 'ae_', 'ägypten'); // ägypten
echo str_ireplace('E', 'e_', 'egypt'); // e_gypt
echo str_ireplace('e', 'e_', 'Egypt'); // e_gypt
echo str_ireplace('ä', 'ae_', mb_strtolower('Ägypten')); // ae_gypten
sawdust
16 年前
以下提供一個不同的搜尋結果關鍵字高亮顯示方法,它會以不區分大小寫的方式匹配所有關鍵字子字串,並在返回的文本中保留原始大小寫。此解決方案首先以不區分大小寫的方式擷取 $haystack 中的所有匹配項,然後迴圈處理每個匹配的子字串,並在 $haystack 中應用區分大小寫的替換。如此一來,每個唯一的(就大小寫而言)$needle 實例都會被單獨處理,允許進行區分大小寫的替換,以保留每個唯一 $needle 實例的原始大小寫。

<?php
函式 highlightStr($haystack, $needle, $highlightColorValue) {
// 如果沒有提供高亮顏色或字串,則返回 $haystack,不做任何處理。
if (strlen($highlightColorValue) < 1 || strlen($haystack) < 1 || strlen($needle) < 1) {
return
$haystack;
}
preg_match_all("/$needle+/i", $haystack, $matches);
if (
is_array($matches[0]) && count($matches[0]) >= 1) {
foreach (
$matches[0] as $match) {
$haystack = str_replace($match, '<span style="background-color:'.$highlightColorValue.';">'.$match.'</span>', $haystack);
}
}
return
$haystack;
}
?>
daevid at daevid dot com
19 年前
這是一個我寫的小巧函式,用於對 SQL 字串進行 HTML 顏色標記。

<?php
/**
* Output the HTML debugging string in color coded glory for a sql query
* This is very nice for being able to see many SQL queries
* @access public
* @return void. prints HTML color coded string of the input $query.
* @param string $query The SQL query to be executed.
* @author Daevid Vincent [daevid@LockdownNetworks.com]
* @version 1.0
* @date 04/05/05
* @todo highlight SQL functions.
*/
function SQL_DEBUG( $query )
{
if(
$query == '' ) return 0;

global
$SQL_INT;
if( !isset(
$SQL_INT) ) $SQL_INT = 0;

//[dv] this has to come first or you will have goofy results later.
$query = preg_replace("/['\"]([^'\"]*)['\"]/i", "'<FONT COLOR='#FF6600'>$1</FONT>'", $query, -1);

$query = str_ireplace(
array (
'*',
'SELECT ',
'UPDATE ',
'DELETE ',
'INSERT ',
'INTO',
'VALUES',
'FROM',
'LEFT',
'JOIN',
'WHERE',
'LIMIT',
'ORDER BY',
'AND',
'OR ', //[dv] note the space. otherwise you match to 'COLOR' ;-)
'DESC',
'ASC',
'ON '
),
array (
"<FONT COLOR='#FF6600'><B>*</B></FONT>",
"<FONT COLOR='#00AA00'><B>SELECT</B> </FONT>",
"<FONT COLOR='#00AA00'><B>UPDATE</B> </FONT>",
"<FONT COLOR='#00AA00'><B>DELETE</B> </FONT>",
"<FONT COLOR='#00AA00'><B>INSERT</B> </FONT>",
"<FONT COLOR='#00AA00'><B>INTO</B></FONT>",
"<FONT COLOR='#00AA00'><B>VALUES</B></FONT>",
"<FONT COLOR='#00AA00'><B>FROM</B></FONT>",
"<FONT COLOR='#00CC00'><B>LEFT</B></FONT>",
"<FONT COLOR='#00CC00'><B>JOIN</B></FONT>",
"<FONT COLOR='#00AA00'><B>WHERE</B></FONT>",
"<FONT COLOR='#AA0000'><B>LIMIT</B></FONT>",
"<FONT COLOR='#00AA00'><B>ORDER BY</B></FONT>",
"<FONT COLOR='#0000AA'><B>AND</B></FONT>",
"<FONT COLOR='#0000AA'><B>OR</B> </FONT>",
"<FONT COLOR='#0000AA'><B>DESC</B></FONT>",
"<FONT COLOR='#0000AA'><B>ASC</B></FONT>",
"<FONT COLOR='#00DD00'><B>ON</B> </FONT>"
),
$query
);

echo
"<FONT COLOR='#0000FF'><B>SQL[".$SQL_INT."]:</B> ".$query."<FONT COLOR='#FF0000'>;</FONT></FONT><BR>\n";

$SQL_INT++;

}
//SQL_DEBUG
?>
Anteaus
9 年前
如果您按照這裡給出的說明操作,最終得到的程式碼可以在 php5.3 中運作,但在 php5.4 中會出現錯誤。原因是「&$count」(顯式傳遞參照)現在是非法結構。
這很糟糕,尤其會導致程式碼不可靠,可能在測試環境中可以運作,但在正式環境中卻不行。需要更正手冊!
stepanic dot matija at gmail dot com
14 年前
修正了在此字串中突出顯示第二個 'o' 或 'a' 的問題

<?php
function highlight_string ($haystack, $needle, $highlight_class) {
// 如果沒有提供醒目顯示顏色或字串,則返回 $haystack,無需執行任何操作。

$first_encode='XXXXXXXXXXXXXXX'; //編碼字串

$second_encode='YYYYYYYYYYYYYYY';

preg_match_all("/$needle+/i", $haystack, $matches);
if (
is_array($matches[0]) && count($matches[0]) >= 1) {
foreach (
$matches[0] as $match) {
$haystack = str_replace($match, $first_encode.$match.$second_encode, $haystack);
}
}

$haystack=str_replace(array($first_encode,$second_encode),
array(
'<font class="'.$highlight_class.'" >','</font>'),$haystack);

return
$haystack;
}
?>
aidan at php dot net
20 年前
此功能現在已在 PEAR 套件 PHP_Compat 中實現。

有關如何在不升級 PHP 版本的情況下使用此函式的更多資訊,請參閱以下連結

http://pear.php.net/package/PHP_Compat
ishutko at gmail dot com
15 年前
讓函式可處理斯拉夫字母 (Cyrillic)

setlocale (LC_ALL, 'ru_RU');
Psudo - thepsudo at gmail dot com
13 年前
如果要突出顯示文字但不想使用正規表達式且不破壞大小寫,請嘗試以下方法

<?php
function highlight($needle, $haystack){
$ind = stripos($haystack, $needle);
$len = strlen($needle);
if(
$ind !== false){
return
substr($haystack, 0, $ind) . "<b>" . substr($haystack, $ind, $len) . "</b>" .
highlight($needle, substr($haystack, $ind + $len));
} else return
$haystack;
}
?>

這個範例使用了 HTML 的粗體標籤,但您可以輕鬆地更改醒目顯示的方式。
Michael dot Bond at mail dot wvu dot edu
16 年前
這個函式會醒目顯示搜尋詞彙(關鍵詞前後文)。

這個函式與下方其他函式的不同之處在於,它會保留搜尋詞彙的原始大小寫。因此,如果您搜尋 "american",但在原始字串中是 "American",它會保留大寫的 "A" 以及字串其餘部分的正確大小寫。

<?php
函式 kwic($str1,$str2) {

$kwicLen = strlen($str1);

$kwicArray = 陣列();
$pos = 0;
$count = 0;

while(
$pos !== FALSE) {
$pos = stripos($str2,$str1,$pos);
if(
$pos !== FALSE) {
$kwicArray[$count]['kwic'] = substr($str2,$pos,$kwicLen);
$kwicArray[$count++]['pos'] = $pos;
$pos++;
}
}

for(
$I=count($kwicArray)-1;$I>=0;$I--) {
$kwic = '<span class="kwic">'.$kwicArray[$I]['kwic'].'</span>';
$str2 = substr_replace($str2,$kwic,$kwicArray[$I]['pos'],$kwicLen);
}

return(
$str2);
}
?>
hfuecks at nospam dot org
19 年前
請注意,字元大小寫是由伺服器的語系設定所定義,這會影響包含非 ASCII 字元的字串。

請參閱 strtolower() - https://php.dev.org.tw/strtolower 及其註釋 - str_ireplace 內部會將 $search 和 $replace 轉換為小寫以尋找相符的項目。
holblin at holblin dot com
13 年前
醒目提示的警告…

我使用了

<?php
$text
= preg_replace('/('.$q.')/i','<span class=highlighting "">$1</span>' , $text);
?>

因為這行不允許正確地醒目提示大寫和小寫(例如將大寫轉換為小寫)

<?php
$text
= str_ireplace( $q , '<span class=highlighting "">'.$q.'</span>', $text);
?>

但是當 $q 包含一些正規表達式時,你會遇到一些問題…例如
<?php $q = '('; ?>

所以你必須使用 preg_replace 來正確地標示文字,而且你必須建立一個函式來跳脫不好的正規表達式字元!

我想應該可以找到更好的函式,但我想這個應該堪用。

<?php
函式 regex_escape( $q )
{
返回
preg_replace('/([\[\]\(\)\{\}\-\.\*\?\|\^\$])/', '\$1', $q);
}
?>
To Top