Php 如何用特定字母替换特定数字(长度限制内)?

Php 如何用特定字母替换特定数字(长度限制内)?,php,regex,preg-replace,preg-replace-callback,Php,Regex,Preg Replace,Preg Replace Callback,我尝试使用preg\u replace将数字更改为字母,但仅将数字包装在“中,且子字符串中的字符数不超过7个 示例输入字符串: "3"sca"""co"1"str"0"ctor""r"3"t"0"r"1""locat"5"o"133""0"27""754a49b393c2a0"33"b97"332"cb7"3"c3c07"2""co"1"str"0"ctor""r"3"t"0" 期望的效果是每个符合条件的2变为d,每个符合条件的3变为e 以下是正确替换的示例: “3”变为e “23”变为de

我尝试使用
preg\u replace
将数字更改为字母,但仅将数字包装在
中,且子字符串中的字符数不超过7个

示例输入字符串:

"3"sca"""co"1"str"0"ctor""r"3"t"0"r"1""locat"5"o"133""0"27""754a49b393c2a0"33"b97"332"cb7"3"c3c07"2""co"1"str"0"ctor""r"3"t"0"
期望的效果是每个符合条件的
2
变为
d
,每个符合条件的
3
变为
e

以下是正确替换的示例:

  • “3”
    变为
    e
  • “23”
    变为
    de
  • “33”
    变成
    ee
  • “32”
    变为
    de
  • “333223”
    变成
    eeede
我的编码尝试:

$string = preg_replace("/\"322\"+/", "edd", $string);
$string = preg_replace("/\"233\"+/", "dee", $string);
$string = preg_replace("/\"32\"+/", "ed", $string);
$string = preg_replace("/\"23\"+/", "de", $string);
$string = preg_replace("/\"33\"+/", "e", $string);
$string = preg_replace("/\"333\"+/", "e", $string);
$string = preg_replace("/\"3\"+/", "e", $string);
$string = preg_replace("/\"3\"+/", "e", $string);
$string = preg_replace("/\"3\"+/", "e", $string);
$string = preg_replace("/\"3\"+/", "e", $string);
$string = preg_replace("/\"3\"+/", "e", $string);

如何使用一个preg\u replace调用进行所有符合条件的替换?

要仅替换引号内的2和3,可以执行
preg\u replace\u回调()
来完成该操作

$before = '754a49b393c2a0"33"b97"332"cb7"3"c3c07"2"';

$after = preg_replace_callback(
        '/"([^"]+)"/',
        function ($matches) {
            return str_replace( array( '2', '3' ), array( 'd', 'e' ), $matches[1] );;
        },
        $before
    );

echo $after;

使用此正则表达式在1到7次的双引号之间查找
2
3


(?首先是我建议的代码。然后是对本页所采用技术的回顾

代码:()


Stephane Janicaud和BA_Webimax的
preg_replace_callback()
answers在执行过程中有好的组件,也有不好的组件,但总体逻辑是合理的。我将花点时间找出一些弱点/机会,并提供一些改进

关于模式: 斯蒂芬的模式:
/(?'d','3'=>'e']);

您为什么要尝试替换组合,例如322?这太复杂了。我正在尝试第三方web抓取他们隐藏的获取字符串,如果我替换,我将在替换754a49b393c2a0“33”b97“332”cb7“3”c3c07“2”之前获取完整的获取值替换754A49B393C2A0EEB97EEDCB7EC3C07D后,域/get_id=754A49B393C2A0EEB97EEDCB7EC3C07D这似乎是一个有缺陷的系统。您只能使用10个字符。仅在“数字”中替换,且不超过7个character@Christian编辑以更好地匹配您正在执行的操作。如何在此替换函数中设置[2-9]{1,7}?
$text = '"3"sca"""co"1"str"0"ctor""r"3"t"0"r"1""locat"5"o"133""0"27""754a49b393c2a0"33"b97"332"cb7"3"c3c07"2""co"1"str"0"ct"233223322"or""r"3"t"0"';

$regex = '/(?<=\")[23]{1,7}(?=\")/';

$text = preg_replace_callback($regex, 
    function ($m) {
        switch ($m[0]) {
            case '2': return 'd';
            case '3': return 'e';
            // Add other cases here ...
        }
    },
    $text
);

echo $text;
echo preg_replace_callback('/"([23]{1,7})"/',
        function ($m) {
            return str_replace(['2', '3'], ['d', 'e'], $m[1]);
        },
        $text
    );