PHP Conference Japan 2024

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' 中删除所有连字符,但保留一个,结果为 '-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 年前
"如果 search 是一个数组,而 replace 是一个字符串,则此替换字符串将用于 search 的每个值。但是,反过来是没有意义的。"

我认为这里完全忽略了一个重要(而且根本不是模糊的理论)的用例。例如,PDO 处理参数替换的方式。

如果我们有以下查询:
"SELECT * FROM my_table WHERE (id = ? AND my_column = ? AND other_column = ?);"
"?" 应该被 $parameters 数组中的每个后续变量替换。这正是 "search" 为值而 "replace" 为数组的用例。

考虑到这不仅是一个真实的例子,而且还是核心 PHP 功能的一部分,我发现它在这里被如此轻易地忽略掉非常奇怪。
Wes Foster
14 年前
您可以随意使用 while/for 循环或其他任何方法来优化它,但这是一小段代码,允许您替换在关联数组中找到的字符串。

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

$string = '我喜欢吃苹果,我的狗在我的雪佛兰里';

echo
str_replace_assoc($replace,$string);

// 输出:我喜欢吃橙子,我的猫在我的福特车里
?>

以下是函数

<?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>标签替换的url数组,url可能相似
http://abc.com/parameter/
http://abc.com/

// 首先按长度排序,使最长的排在最前面
usort($urls,'sortByLen');

$replaces=[];

// 用唯一值替换所有url
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'
?>

由于'A'是$search数组中唯一出现在$subject中的字母,因此人们会期望结果为'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 $subject,其中$search数组中的所有子字符串都被$replace数组中的值替换
*/
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!" - 正确!

/*
注意:在CLI中运行以上代码或在你的网络浏览器上查看源代码 - 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 str_ireplace($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> Malicious code </<html>html> etc";
$string=str_replace(array("<html>","</html>"),"",$string);
// 输出: "<html> Malicious code </html> etc"
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); // 基线单引号
$str = str_replace(chr(131), 'NLG', $str); // 佛罗林
$str = str_replace(chr(132), '"', $str); // 基线双引号
$str = str_replace(chr(133), '...', $str); // 省略号
$str = str_replace(chr(134), '**', $str); // 剑号(第二个脚注)
$str = str_replace(chr(135), '***', $str); // 双剑号(第三个脚注)
$str = str_replace(chr(136), '^', $str); // 抑扬符
$str = str_replace(chr(137), 'o/oo', $str); // 千分号
$str = str_replace(chr(138), 'Sh', $str); // S带分音符
$str = str_replace(chr(139), '<', $str); // 左单引号
// $str = str_replace(chr(140), 'OE', $str); // OE连字
$str = str_replace(chr(145), "'", $str); // 左单引号
$str = str_replace(chr(146), "'", $str); // 右单引号
// $str = str_replace(chr(147), '"', $str); // 左双引号
// $str = str_replace(chr(148), '"', $str); // 右双引号
$str = str_replace(chr(149), '-', $str); // 项目符号
$str = str_replace(chr(150), '-–', $str); // 短破折号
$str = str_replace(chr(151), '--', $str); // 长破折号
// $str = str_replace(chr(152), '~', $str); // 代字号
// $str = str_replace(chr(153), '(TM)', $str); // 商标符号
$str = str_replace(chr(154), 'sh', $str); // s带分音符
$str = str_replace(chr(155), '>', $str); // 右单引号
// $str = str_replace(chr(156), 'oe', $str); // oe连字
$str = str_replace(chr(159), 'Y', $str); // Y带分音符
$str = str_replace('°C', '&deg;C', $str); // 摄氏度使用频率很高,因此添加此项是有意义的
$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编码的)。省略号和长短破折号也得到了替换。

在右边的双智能引号的â€之后有一个“不可见”字符,这里似乎没有显示出来。它是chr(157)。

<?php
$find
[] = '“'; // 左侧双智能引号
$find[] = '”'; // 右侧双智能引号
$find[] = '‘'; // 左侧单智能引号
$find[] = '’'; // 右侧单智能引号
$find[] = '…'; // 省略号
$find[] = '—'; // 长破折号
$find[] = '–'; // 短破折号

$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 “The text was replaced $num times. < 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部分:用<br/>替换&nbsp;代码,或用&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
function mb_chars_replace($from, $to, $subj, $delSymb='_') {
$nsubj='';
preg_match_all('/(.)/u', $subj, $subj);$subj=$subj[1];
if (!
is_array($from)) {preg_match_all('/(.)/u', $from, $from);$from=$from[1];}
if (!
is_array($to)) {preg_match_all('/(.)/u', $to, $to);$to=$to[1];}
if (
count($from)!==count($to)) return false;

foreach(
$subj as $s) {
foreach(
$from as $k=>$f) {
if(
$s===$f) {
$s=$to[$k];
break;
}
}
if(
$s!==$delSymb) $nsubj.=$s;
}
return
$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
function 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://dev.mysqlserver.cn/doc/refman/5.7/en/string-literals.html

在转义各种控制序列之前,必须首先转义现有的反斜杠,以防止双重转义。

<?php
$result
= str_replace(
array(
'\\', "\0", "'", "\x8" /* BS */, "\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 年前
如果你需要在一个字符串中替换另一个字符串,但只替换一次,并且仍然在所有可能的组合中替换(例如,将“a”替换为“x”在“aba”中,得到数组(“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年前
在使用 `str_replace` 函数时,如果 `$search` 和 `$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