用PHP中的字符串中的数字/数字替换匹配的单词

时间:2015-08-09 02:59:51

标签: php regex string

我想用数字/数字替换字符串中的一些单词,只有当该单词后跟或前面有数字时才允许用数字/数字[中间允许的空格]。例如,下面是一个示例字符串,我希望将替换为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

2 个答案:

答案 0 :(得分:2)

这可能有点太长了,但你明白了:

http://3v4l.org/JfXBN

<?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
此代码段可能会失败,也可能不会失败,具体取决于您是否期望82482 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);