使用正则表达式处理包含动态数值并支持运算的字符串

背景说明

假设游戏技能介绍中,我们需要描述技能伤害、技能冷却时间等数值。如果需要改变一个数值,除了修改存储的数值以外,我们还需要修改技能介绍对于这个数值的描述。有时候经常会修改了数值而忘记修改描述,造成技能的使用效果并不像其描述的那样。

所以我们可以使用占位符,再使用正则表达式做替换,并进行处理,简化以后每一次的数值修改。只需要关心数值修改,不需要再每一次都修改描述。另外,由于我们在技能描述中的数值单位与数值在存储单位不一定相同,所以必须要支持基本的数值运算。比如1000ms换成1秒。

假设技能描述是这样的"冷却时间:{#cd}毫秒,{#cd/1000}秒",cd的值为1000。那么这个描述经过处理后是这样的"冷却时间:1000毫秒,1秒"。

代码

php

class Skill
{
    /**
     * 技能介绍
     */
    public $introduction="";
    /**
     * 冷却时间 单位ms
     */
    public $cd=0;


    public function handleIntroduction()
    {
        $content=$this->introduction;
        //找出所有被{}及其包裹的内容集合
        //$matchs[0]为带{}的集合 $matchs[1]为不带{}的集合
        preg_match_all("/\{([^\{\}]+)\}/",$content,$matchs);
        for ($i = 0; $i < count($matchs[1]); $i++)
        {
            $math=$matchs[1][$i];
            //从包裹内容中匹配出变量名
            //$valueNames[0]为带#的变量名 $valueNames[1]为不带#的变量名
            preg_match_all("/\#([^\+\-\*\/0-9]+)/",$math,$valueNames);
            for ($j= 0; $j < count($valueNames[1]); $j++)
            {
                $valueName=$valueNames[1][$j];
                //getValue方法获取相应变量名的变量值
                $value=$this->getValue($valueName);
                //替换掉{}及其包裹的内容
                $math=str_replace($valueNames[0][$j],$value,$math);
            }
            //所有变量名换成了变量值,进行运算
            $math=eval("return $math;");
            $content=str_replace($matchs[0][$i],$math,$content);
        }
        $this->introduction =$content;
    }

	private function getValue($valueName)
    {
        $value = $this->$valueName;
        if ($value != null)
        {
            return $value;
        }else{
            return 0;
        }
    }
}

调用

$skill=newSkill;

$skill->cd=1000;

$skill->introduction="冷却时间:{#cd}毫秒,{#cd/1000}秒";

$skill->handleIntroduction();

print_r($skill->introduction);

//冷却时间:1000毫秒,1秒


 


扫描二维码关注公众号,回复: 4235756 查看本文章

猜你喜欢

转载自blog.csdn.net/a459909293/article/details/79389915
今日推荐