我想用数字/数字替换字符串中的一些单词,只有当该单词后跟或前面有数字时才允许用数字/数字[中间允许的空格]。例如,下面是一个示例字符串,我希望将太替换为2,将替换为替换为4.我已尝试使用str_replace,但不能完全满足目的因为它取代了字符串
中的所有 和$str = 'Please wait for sometime too, the area code is for 18 and phone number is too 5897 for';
$str = str_ireplace(' for ', '4', $str);
$str = str_ireplace(' too ', '2', $str);
echo $str;
但它没有给我所需的输出 请等一段时间,区号为418,电话号码为258974
答案 0 :(得分:2)
这可能有点太长了,但你明白了:
<?php
$str="Please wait for sometime too, the area code is for 18 and phone number is too 5897 for";
$str=preg_replace('#(\d)\s*for#','${1}4',$str);
$str=preg_replace('#(\d)\s*too#','${1}2',$str);
$str=preg_replace('#for\s*(\d)#','4${1}',$str);
$str=preg_replace('#too\s*(\d)#','2${1}',$str);
echo $str;
输出:
请等一段时间,区号为418,电话号码为258974
如果您的字符串如下所示:8 too for
,
此代码段可能会失败,也可能不会失败,具体取决于您是否期望824
或82 for
,因为它不执行递归替换(当前序列返回82 for
)。
答案 1 :(得分:1)
您应该使用preg_replace_callback()
:
$str = preg_replace_callback('~\d\K\h*(?:too|for)|(?:too|for)\h*(?=\d)~i',
function($m) {
return strtr(strtolower(trim($m[0])), array('too'=>2,'for'=>4));
}, $str);