如何将我的字符串的某个部分替换为另一部分呢?
输入字符串:
"Hello my name is Santa"
如何用其他内容更改字符串中的所有a
?
我想我需要一个foreach
循环,但我不确定如何使用它。
答案 0 :(得分:23)
strtr ($str, array ('a' => '<replacement>'));
<强>更新强>:
strtr ("hello my name is santa", array ('a' => '<replacement>'));
更准确地回答你的问题。
答案 1 :(得分:20)
有一些不同的功能/方法可以用其他东西替换字符串的某个部分,所有这些都有其自身的优势。
str_replace()
方法(二进制安全;区分大小写) <强>参数强>
混合str_replace(混合 $ search ,混合 $ replace ,混合 $ subject [,int&amp; $ count])
str_replace()
有3个必需参数,你可以在上面的定义中看到正确的顺序,所有这些参数都可以将一个字符串作为一个数组作为参数!
搜索&amp;取代强>
搜索(字符串)和替换(字符串) →用替换字符串替换搜索字符串。
搜索(数组)和替换(字符串) →用替换字符串替换所有搜索元素。
搜索(字符串)和替换(数组) →向您发出通知:&#34;注意:数组到字符串转换&#34;,因为只有一个搜索字符串的替换数组没有意义,所以尝试将数组转换为字符串。
搜索(数组)和替换(数组) →用相应的替换元素替换每个搜索元素(忽略键!)。
搜索(更多元素)和替换(更少元素) →用相应的替换元素替换每个搜索元素(对于缺少的替换元素,使用空字符串将被使用)。
搜索(更少元素)和替换(更多元素) →用相应的替换元素替换每个搜索元素(忽略不需要的替换元素)。< / p>
<强>主题强>
主题(字符串) →替换主题字符串。
subject(数组) →替换每个数组元素。
<强>代码强>
echo str_replace("search", "replace", "text search text");
echo str_replace(["t", "a"], "X", "text search text");
echo str_replace("search", ["replace1", "replace2"], "text search text");
echo str_replace(["a", "c"], ["X", "Y"], "text search text");
<强>输出强>
text replace text
XexX seXrch XexX
Notice: Array to string conversion
text seXrYh text
备注强>
疑难杂症!
重要的是要知道str_replace()
从数组的左侧到右侧工作。这意味着它可以替换您已经替换的值。例如:
echo str_replace(array("a", "b"), array("b", "c"), "aabb");
//Probably expected output: bbcc
//Actual output: cccc
不区分大小写
如果您想使搜索字符不敏感,可以使用str_ireplace()
(注意案例的i
- i nsensitive)。
多维数组
str_replace()
/ str_ireplace()
不适用于多维数组。有关此类实现,请参阅此manual comment。当然,对于不区分大小写的情况,您也可以将str_replace()
替换为str_ireplace()
。
如果你想将所有内容放在一起并创建一个也适用于不区分大小写的多维数组的函数,你可以这样做:
<?php
function str_ireplace_deep($search, $replace, $subject)
{
if (is_array($subject))
{
foreach($subject as &$oneSubject)
$oneSubject = str_ireplace_deep($search, $replace, $oneSubject);
unset($oneSubject);
return $subject;
} else {
return str_ireplace($search, $replace, $subject);
}
}
?>
&#13;
strtr()
方法(50%二进制安全;区分大小写) 参数
string strtr(字符串 $ str ,字符串 $ from ,字符串 $ to )
string strtr(string $ str ,数组 $ replace_pairs )
该函数要么带有3个带有from和to字符串的参数,要么带有2个带有替换数组array("search" => "replace" /* , ... */)
的参数,所有这些都可以在上面的定义中看到正确的顺序。
2个参数
它开始用相应的值替换最长的密钥并执行此操作,直到它替换所有key => value
对。在这种情况下,该函数是二进制安全的,因为它使用整个键/值。
3个参数
它将from参数替换为主题中的to参数逐字节。所以它不是二进制安全的!
如果from和to参数的长度不相等,则替换将在到达较短字符串的末尾时停止。
<强>主题强>
它不接受数组作为主语,只是一个字符串。
<强>代码强>
echo strtr("text search text", "ax", "XY");;
echo strtr("text search text", ["search" => "replace"]);
<强>输出强>
teYt seXrch teYt
text replace text
备注强>
疑难杂症!
反对str_replace()
,strtr()
不会替换两次。举个例子:
echo strtr("aabb", ["a" => "b", "b" => "c"]);
//Expected output: bbcc
//Actual output: bbcc
此外,如果您想使用相同的字符串替换多个内容,可以使用array_fill_keys()
使用值填充替换数组。
不区分大小写
strtr()
不区分大小写NOR是否存在不区分大小写的等效函数。有关不区分大小写的实现,请参阅此manual comment。
多维数组
strtr()
确实反对str_replace()
不使用数组作为主题,因此它也不适用于多维数组。您当然可以将str_replace()
上面的代码用于多维数组,只需将其与strtr()
或stritr()
的实现一起使用。
如果你想将所有内容放在一起并创建一个也适用于不区分大小写的多维数组的函数,你可以这样做:
<?php
if(!function_exists("stritr")){
function stritr($string, $one = NULL, $two = NULL){
/*
stritr - case insensitive version of strtr
Author: Alexander Peev
Posted in PHP.NET
*/
if( is_string( $one ) ){
$two = strval( $two );
$one = substr( $one, 0, min( strlen($one), strlen($two) ) );
$two = substr( $two, 0, min( strlen($one), strlen($two) ) );
$product = strtr( $string, ( strtoupper($one) . strtolower($one) ), ( $two . $two ) );
return $product;
}
else if( is_array( $one ) ){
$pos1 = 0;
$product = $string;
while( count( $one ) > 0 ){
$positions = array();
foreach( $one as $from => $to ){
if( ( $pos2 = stripos( $product, $from, $pos1 ) ) === FALSE ){
unset( $one[ $from ] );
}
else{
$positions[ $from ] = $pos2;
}
}
if( count( $one ) <= 0 )break;
$winner = min( $positions );
$key = array_search( $winner, $positions );
$product = ( substr( $product, 0, $winner ) . $one[$key] . substr( $product, ( $winner + strlen($key) ) ) );
$pos1 = ( $winner + strlen( $one[$key] ) );
}
return $product;
}
else{
return $string;
}
}/* endfunction stritr */
}/* endfunction exists stritr */
function stritr_deep($string, $one = NULL, $two = NULL){
if (is_array($string))
{
foreach($string as &$oneSubject)
$oneSubject = stritr($string, $one, $two);
unset($oneSubject);
return $string;
} else {
return stritr($string, $one, $two);
}
}
?>
&#13;
preg_replace()
方法(二进制安全;区分大小写) <强>参数强>
混合preg_replace(混合 $ pattern ,混合 $ replacement ,混合 $ subject [,int $ limit = -1 [,int&amp; ; $ count]])
preg_replace()
按上面显示的顺序有3个必需参数。现在,它们中的所有3个都可以将一个字符串也作为一个数组作为参数!
搜索&amp;取代强>
搜索(字符串)和替换(字符串) →将替换字符串替换为搜索正则表达式的所有匹配项。
搜索(数组)和替换(字符串) →用替换字符串替换每个搜索正则表达式的所有匹配项。
搜索(字符串)和替换(数组) →向您发出警告:&#34;警告:preg_replace():参数不匹配,模式为替换是一个数组&#34;,因为只有一个搜索正则表达式的替换数组没有意义。
搜索(数组)和替换(数组) →用相应的替换元素替换每个搜索正则表达式的所有匹配项(忽略键!)。< / p>
搜索(更多元素)和替换(更少元素) →用相应的替换元素替换每个搜索正则表达式的所有匹配项(对于缺少的替换元素将使用空字符串。)
搜索(更少元素)和替换(更多元素) →将每个搜索正则表达式的所有匹配项替换为相应的替换元素(忽略不需要的替换元素)。
<强>主题强>
主题(字符串) →替换主题字符串。
subject(数组) →替换每个数组元素。
请再次注意:搜索必须是正则表达式!这意味着它需要分隔符,并且需要转义特殊字符。
<强>代码强>
echo preg_replace("/search/", "replace", "text search text");
echo preg_replace(["/t/", "/a/"], "X", "text search text");
echo preg_replace("/search/", ["replace1", "replace2"], "text search text");
echo preg_replace(["a", "c"], ["X", "Y"], "text search text");
<强>输出强>
text replace text
XexX seXrch XexX
Warning: preg_replace(): Parameter mismatch, pattern is a string while replacement is an array
text seXrYh text
备注强>
疑难杂症!
与str_replace()
相同,preg_replace()
从数组的左侧到右侧工作。这意味着它可以替换您已经替换的值。例如:
echo preg_replace(["/a/", "/b/"], ["b", "c"], "aabb");
//Probably expected output: bbcc
//Actual output: cccc
不区分大小写
由于搜索参数是正则表达式,因此您只需传递flag i
以进行不区分大小写的搜索。
多维数组
preg_replace()
不适用于多维数组。
向引用
请注意,您可以使用\\n
/ $n
作为正则表达式捕获组的反向引用。其中0
为整个匹配,1-99
为您的捕获组。
此外,如果反面引用后面紧跟一个数字,则必须使用\${n}
。
替换/&#34; / e修饰符已弃用&#34;
preg_replace()
中的替换不能使用回调函数作为替换。所以你必须使用preg_replace_callback()
。当您使用修饰符e
并获取&#34;不推荐使用时:preg_replace():不推荐使用/ e修饰符,而是使用preg_replace_callback&#34;。请参阅:Replace preg_replace() e modifier with preg_replace_callback
如果你想将所有内容放在一起并创建一个也适用于不区分大小写的多维数组的函数,你可以这样做:
<?php
function preg_replace_deep($search, $replace, $subject)
{
if (is_array($subject))
{
foreach($subject as &$oneSubject)
$oneSubject = preg_replace_deep($search, $replace, $oneSubject);
unset($oneSubject);
return $subject;
} else {
return preg_replace($search, $replace, $subject);
}
}
?>
&#13;
while
/ for
/ foreach
方法(非二进制安全;区分大小写) 当然,除了所有这些函数之外,您还可以使用一个简单的循环来遍历字符串并替换您拥有的每个search => replace
对。
但是,当你使用二进制安全,不区分大小写和多维数组时,这比使用上面的函数更复杂。所以我不会在这里包含任何例子。
现在,上面显示的所有方法都会对整个字符串进行替换。但有时你只想替换字符串的某个部分。
为此您可能希望/可以使用substr_replace()
。或者另一种常见方法是使用substr()
并仅在该特定子字符串上应用替换,然后将字符串放在一起。当然,您也可以修改正则表达式或执行其他操作以不将替换应用于整个字符串。
答案 2 :(得分:1)
str_replace足以用于简单的替换作业(,例如替换单个字母),但通常建议使用preg_replace(如果您想要更灵活或更通用的 ),因为它灵活多变。因为'a'只是一个例子......:
$String = preg_replace('/<string>/','<replacement>',$String);
或者如果您想同时进行多次替换:
$String = preg_replace(array('/<string 1>/','/<string 2>/'),array('<replacement 1>','<replacement 2>'),$String);
不幸的是,preg_replace可能非常难以使用。我推荐以下内容: http://php.net/manual/en/function.preg-replace.php http://www.phpro.org/tutorials/Introduction-to-PHP-Regex.html
此外,如果您决定使用str_replace(),并且您的替换需要区分大小写,那么您将需要str_ireplace()。
答案 3 :(得分:1)
这也可以在没有任何php str功能的情况下将你的'a'改为'&amp;' &符号:
for ($i=0; $i<strlen($str); $i++){
if ($str[$i]=='a'){
$str[$i]='&';
}
}
echo $str;
答案 4 :(得分:0)
使用函数preg_replace()
$text ='this is Old word';
echo $text;
echo '<br>';
$text = preg_replace('/\bOld word\b/', 'NEW WORD', $text);
echo $text;