str_ireplace

(PHP 5, PHP 7, PHP 8)

str_ireplace不区分大小写的 str_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

要搜索的值,也称为。可以使用数组指定多个针。

replace

替换值,用于替换找到的 search 值。可以使用数组指定多个替换值。

subject

要搜索和替换的字符串或数组,也称为干草堆

如果 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 演示了这将如何在实践中影响您。

参见

  • str_replace() - 用替换字符串替换搜索字符串的所有出现次数
  • preg_replace() - 执行正则表达式搜索和替换
  • strtr() - 翻译字符或替换子字符串

添加注释

用户贡献的注释 12 个注释

27
sawdust
15 年前
这是一种不同的搜索结果关键字突出显示方法,它将以不区分大小写的方式匹配 $haystack 中所有关键字子字符串,并在返回的文本中保留大小写。此解决方案首先以不区分大小写的方式获取 $haystack 中的所有匹配项,然后循环遍历每个匹配的子字符串,并在 $haystack 中应用区分大小写的替换。这样,每个唯一(在大小写方面)的 $needle 实例都会被单独操作,从而允许进行区分大小写的替换,以保留每个 $needle 唯一实例的原始大小写。

<?php
function 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;
}
?>
16
daevid at daevid dot com
19 年前
这是一个我编写的用于对 SQL 字符串进行 HTML 颜色编码的小巧实用函数。

<?php
/**
* 以彩色代码输出 SQL 查询的 HTML 调试字符串
* 这对于查看多个 SQL 查询非常有用
* @access public
* @return void. 打印输入 $query 的 HTML 彩色代码字符串。
* @param string $query 要执行的 SQL 查询。
* @author Daevid Vincent [[email protected]]
* @version 1.0
* @date 04/05/05
* @todo 突出显示 SQL 函数。
*/
function SQL_DEBUG( $query )
{
if(
$query == '' ) return 0;

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

//[dv] 这必须放在前面,否则后面会出现奇怪的结果。
$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] 注意空格。 否则你会匹配到 '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
?>
6
Anteaus
9 年前
如果您按照这里给出的说明操作,最终得到的是在 php5.3 中有效但在 php5.4 中出现错误的代码。 原因是 '&$count'(显式按引用传递)现在是一个非法的结构。
很糟糕,尤其会导致不可靠的代码,这些代码可能在测试中有效但在生产环境中无效。 手册需要更正!
4
stepanic dot matija at gmail dot com
13 年前
修复了在该字符串中突出显示第二个 '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;
}
?>
4
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 粗体标签,但您可以轻松更改突出显示方法。
3
aidan at php dot net
20 年前
此功能现在已在 PEAR 包 PHP_Compat 中实现。

有关在不升级 PHP 版本的情况下使用此函数的更多信息,请访问以下链接

http://pear.php.net/package/PHP_Compat
2
ishutko at gmail dot com
15 年前
用于与西里尔字母一起使用的函数

setlocale (LC_ALL, 'ru_RU');
2
Tom
4 个月前
注意! 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
-2
hfuecks at nospam dot org
19 年前
请注意,字符大小写由服务器的区域设置定义,这会影响包含非 ASCII 字符的字符串。

请参阅 strtolower() - https://php.net/strtolower 和评论 - 在内部,str_ireplace 将 $search 和 $replace 转换为小写以查找匹配项。
-2
Michael dot Bond at mail dot wvu dot edu
15 年前
此函数将突出显示搜索词(上下文中的关键词)。

此函数与以下函数的区别在于,它将保留搜索词的原始大小写。 因此,如果您搜索“american”,但在原始字符串中它为“American”,它将保留大写字母“A”以及字符串其余部分的正确大小写。

<?php
function kwic($str1,$str2) {

$kwicLen = strlen($str1);

$kwicArray = array();
$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);
}
?>
-5
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
function regex_escape( $q )
{
return
preg_replace('/([\[\]\(\)\{\}\-\.\*\?\|\^\$])/', '\$1', $q);
}
?>
-12
triplepoint at gmail dot com
13 年前
关于为搜索高亮显示目的保持查找/替换的大小写

如果正则表达式的性能损失不是大问题,那么可以这样做

<?php
function highlight_matches($find_text, $text) {
return
preg_replace("/($find_text)/i", '<span class="search_item">$1</span>', $text);
}
?>
To Top