str_replace

(PHP 4、PHP 5、PHP 7、PHP 8)

str_replace替换搜索字符串的所有出现项为替换字符串

描述

str_replace(
    array|string $search,
    数组类型|字符串类型 $replace,
    字符串类型|数组类型 $subject,
    整型 &$count = null
): 字符串类型|数组类型

此函数会返回一个字符串或一个数组,其中 subject 中的所有 search 都会被指定的 replace 值替换。

要基于指定模式而不是固定字符串替换文本,请使用 preg_replace()

参数

如果 searchreplace 是数组,则 str_replace() 会从每个数组中获取一个值,然后在 subject 中使用它们进行搜索和替换。如果 replace 中的值比 search 少,则会使用一个空字符串作为其余的替换值。如果 search 是数组而 replace 是字符串,则此替换字符串会针对 search 的每个值使用。不过,相反的情况是讲不通的。

如果 searchreplace 是数组,则首先处理其元素,然后是最后。

search

要搜索的值,即所谓的“needle”。可以使用数组来指定多个“needle”。

replace

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

subject

要搜索和替换的字符串或数组,即所谓的“haystack”。

如果 subject 是数组,则会对 subject 的每个条目执行搜索和替换,并且返回值也是一个数组。

count

如果传递了此参数,则会将其设置为执行的替换次数。

返回值

此函数会返回一个字符串或一个数组,其中包含替换后的值。

范例

范例 #1 基本 str_replace() 范例

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

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

// Provides: 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);

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

示例 #2 潜在 str_replace() 陷阱示例

<?php
// Order of replacement
$str = "Line 1\nLine 2\rLine 3\r\nLine 4\n";
$order = array("\r\n", "\n", "\r");
$replace = '<br />';

// Processes \r\n's first so they aren't converted twice.
$newstr = str_replace($order, $replace, $str);

// Outputs F because A is replaced with B, then B is replaced with C, and so on...
// Finally E is replaced with F, because of left to right replacements.
$search = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'A';
echo
str_replace($search, $replace, $subject);

// Outputs: apearpearle pear
// For the same reason mentioned above
$letters = array('a', 'p');
$fruit = array('apple', 'pear');
$text = 'a p';
$output = str_replace($letters, $fruit, $text);
echo
$output;
?>

注意

注意此函数是二进制安全的。

警告

替换顺序陷阱

由于 str_replace() 从左到右进行替换,执行多次替换时可能会替换先前插入的值。请参阅本文档中的示例。

注意:

此函数区分大小写。对于不区分大小写的替换,请使用 str_ireplace()

另请参阅

添加说明

用户贡献的说明 34 条说明

nikolaz dot tang at hotmail dot com
13 年前
对于多维数组中的字符串,一种更快的替换方式是使用 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
moostende at gmail dot com
12年前
请注意,此方法不会替换变为替换字符串一部分的字符串。当你想在同一字符串中多次删除重复模式的所有实例时,此方法可能会出问题。

如果你想从字符串“-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
Alberto Lepe
15年前
替换字符时请务必小心(或在 FROM 和 TO 数组中替换重复模式)

例如

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

我预计的结果为:“ZDDB”
然而,返回值却是:“ZDDD”
(因为根据我们的数组,B = D)

要解决此问题,请使用“strtr”作为代替

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

返回值:“ZDDB”
karst at onlinq dot nl
9 年前
"如果 search 是一个数组而 replace 是一个字符串,那么此替换字符串将用于 search 的每个值。当然,反之则毫无意义。"

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

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

考虑到这不仅是一个真实世界的示例,也是 PHP 核心功能的一部分,因此我发现它在这里被如此轻松地 dismiss 掉着实令人惊讶。
Wes Foster
14 年前
您可以使用 while/for 或任何方式来优化此操作,但这部分代码允许您替换在关联数组中找到的字符串。

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

$string = '我跟我家的狗在雪佛兰里面吃苹果';

echo
str_replace_assoc($replace,$string);

// Echo:我跟我家的猫在福特里面吃桔子
?>

这是一个函数

<?php
函数 strReplaceAssoc(数组 $replace, $subject) {
返回
str_replace(array_keys($replace), array_values($replace), $subject);
}
?>

[2010 年 6 月 1 日 - 由 php DOT net 上的 thiago 编辑:函数已被 ljelinek AT gmail DOT com 发送的更新版本替换]
ravenswd at gmail dot com
6 年前
这是在搜索和替换数组大小不同时发生的情况

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

$search = 数组('a', 'b', 'c');
$replace = 数组('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
= 数组('A', 'B', 'C', 'D', 'E');
$replace = 数组('B', 'C', 'D', 'E', 'F');
$subject = 'ABCDE';

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

在以上代码中,$search 和 $replace 应将 $subject 中的每个出现替换为字母表中的下一个字母。此示例的预期输出为 'BCDEF';但是,实际输出为 'FFFFF'。

为了更清楚地说明这点,请考虑以下示例

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

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

由于 $search 数组中唯一包含在 $subject 中的字母是 'A',所以预期结果为 'B';但是,替换编号 $n *不* 操作 $subject,而是在完成之前的 $n-1 次替换之后操作 $subject。

以下函数利用 array_combine 和 strtr 产生预期输出,我认为这是在不受之前替换影响最终结果的情况下执行所需字符串替换的最有效方法。

<?php
/**
* 当使用 str_replace(...) 时,在原始字符串中不存在的值(但之前的
* 替换中出现了)将被连续替换。此字符串替换函数旨在使用 $replace 中的值替换
* $search 中的值,而不用考虑之前的替换。请注意,此函数将
* 总是先查找最长的可能匹配项,然后逐个字符地处理。
*
* “stro_replace” 中的 “o” 表示 “original”,表示函数仅在原始字符串上操作。
*
* @param array $search 需要替换的字符串或字符列表
* @param array $replace 将替换 $search 中相应值的字符串或字符列表
* @param string $subject 执行此操作的字符串
*
* @return string 其中 $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 stro_replace($search, $replace, $subject); // 输出:MIKE AND JON LIKE PHP,正确
?>
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> 等"
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']));
?>
jay_knows_(all)uk at hotmail dot com
13 年前
这删除了可怕的 Microsoft 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;
}

?>
jbarnett at jmbelite dot com
14 年前
可能值得一提的是,完成示例 2(潜在问题)的简单方法就是简单地反向开始“替换”。

因此,不要从“A”开始,以“E”结束

<?php
$search
= array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
// 用 B 替换 A,用 C 替换 B,用 D 替换 C,用 E 替换 D,用 F 替换 E(全部替换为 F)
// 从“E”开始,以“A”结束:

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

因此,从“末尾”开始,按“替换值”与“搜索数组”中之后的值不相等的顺序放置替换项即可。
viundan at gmail dot com
7 年前
避免“在进行多次替换时可能替换先前插入的值”问题的决定。另请参阅此文档中的示例。

$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);
}

希望这也能帮助其他和我一样的人
matt wheaton
18 年前
为了去除那些 Word 复制粘贴的智能引号,我发现这适用于 UTF8 编码的字符串(以下示例中的 $text 为 UTF8 编码)。另外,省略号、em 破折号和 en 破折号也均被替换掉。

“ 符号后有一个“不可见”字符,用于双引号右侧的智能引号,但此处似乎未显示。它就是 chr(157)。

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

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

$text = str_replace($find, $replace, $text);
?>
[email protected]
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;
}
?>
apmuthu at usa dot net
14 年前
如果我们有一个 html 模板,其中包含大括号中需要在运行时替换的占位符,则以下功能将使用 str_replace 来执行此操作

<?php

函数 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;
}

?>
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;
}
?>
Ing. Mirko Plazotta
9 年前
<?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;
?>
Denzel Morris
12年前
对于经验丰富的 PHP 程序员来说这可能很明显,但对于初学者 PHP 程序员来说却不是 so 这是无效的
<?php
str_replace
($search, $replace, $subject, 1);
?>
乍一看,它似乎是一个合理的要求,直到你意识到第四个参数必须是一个变量才能传递为引用。一个替换
<?php
str_replace
($search, $replace, $subject, $temp = 1);
// 或
$temp = 1;
str_replace($search, $replace, $subject, $temp);
?>
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; 等。
Oyedele Hammed Horlah - itz dot harmid at gmail dot com
6 年前
这是一个简单的函数,用于将所有换行符替换为 <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
?>

尽情享用
Mohsin Ali (puregenius02 at gmail dot com)
8 年前
$myString = “It was the best of mine it was the worst of mine,”;
// 显示“这是最好的香蕉,这是最差的香蕉”,
echo str_replace( “mine”, “bananas”, $myString );
如果您想知道搜索字符串被替换的次数,请将一个变量作为可选
第四个参数。在运行函数后,此变量保存替换的次数
$myString = “It was the best of mine, it was the worst of mine,”;
// 显示“这是最好的香蕉,这是最差的香蕉”,
echo str_replace( “mine”, “bananas”, $myString, $num ) . “ < br/ > ”;
// 显示“文字被替换了 2 次。”
echo “The text was replaced $num times. < br/ > ”;
markem at sim1 dot us
9 年前
我在使用 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 中引起问题。
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);

在此情况下,我使用 %% 作为令牌,因为它对于我自己而言是一个不太可能的字符组合。
flame2000 at mail dot ru
7 年前
替换多字节字符串中的字符。
例如,将 '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;
}

//examples:

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

// or

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

//out:
echo mb_chars_replace($from,$to,"foot, beer"); //beer+foot
?>
jefrey at forteras dot tech
6 年前
切勿使用此函数来防止 SQL 注入。

这听起来可能很可笑,但我真见过一些开发人员这样做。

有趣的是,这些开发人员使用 str_replace(让我们忽视他们甚至未使用不区分大小写的 str_ireplace 这个事实)从用户输入的数据中删除“SELECT”或“DROP”之类的常见 SQL 命令。

有趣的是:

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

是的,你可以循环执行它,但 str_replace 从来都不应该这样使用。有适当的方法来防止 SQL 注入,例如使用预处理语句(占位符)。
christof dot rieger at r-tron dot de
12年前
在许多国家,“1.000,33”为数字格式,而在英语中,它为“1,000.33”。

此函数总是会将数字参数转换为 PHP 确认的数字格式。如果数字字符串中只有一个分隔符,则将其解释为小数点。

函数 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);
}
?>
Anonymous
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
函数 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")); // result as mentioned above
?>
它可能不会有最佳的性能,但它运行了。
vuabid at hotmail dot com
6 年前
在使用 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"
iskus1981 at gmail dot com
4 年前
bracesChecker($str) {
当 $str 不为空时执行以下操作:
$str = str_replace(['()','[]','{}'], '', $str, $count);
如果 $str 为空,则返回 true;
如果 $str 不为空,且 $count 也为空,则返回 false;
}
}
$str = '[}]{(){][}()';
echo bracesChecker($str);
//false
$str = '([]{})[{}[]{[]}([{[]}])';
echo bracesChecker ($str);
//true
To Top