V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tangknox1
V2EX  ›  PHP

请教一个 str_replace 替换 花括号的问题

  •  
  •   tangknox1 · 89 天前 · 1514 次点击
    这是一个创建于 89 天前的主题,其中的信息可能已经有所发展或是发生改变。
    <?php

    $string = 高清贴图将《{$title}》 PC 版的画面;

    $tit = 战车 2;

    echo str_replace("{$title}", "$tit", $string);

    ?>

    把 $string 中的内容里的 {$title} 替换为 $tit ,试了好几次,怎么也无法去掉完整的 {$title},怎么搞都是只能删除 {$title 后面只要加 } 就无法匹配出来。

    小白求教,怎么搞才行。。
    18 条回复    2022-05-20 13:35:18 +08:00
    swordmaster
        1
    swordmaster  
       89 天前
    把双引号换成单引号
    IceBay
        2
    IceBay  
       89 天前
    用的双引号,被解析成变量值,换成单引号。
    pota
        3
    pota  
       89 天前
    echo str_replace("{{$title}}", "$tit", $string);
    tangknox1
        4
    tangknox1  
    OP
       89 天前
    @IceBay 单引号也试了下,因为 {$title} 是 CMS 程序里模板引擎的数据调用标签,并且我试了下转义 比如 \{ 也不行。
    tangknox1
        5
    tangknox1  
    OP
       89 天前
    @pota 这样也不行,前台打印后输出的是 《{$title}》
    lizuoqiang
        6
    lizuoqiang  
       89 天前
    $string = '高清贴图将《{$title}》 PC 版的画面';

    $tit = '战车 2';

    echo str_replace('{$title}', $tit, $string);
    IceBay
        7
    IceBay  
       89 天前
    @tangknox1 #4 说说你想要的输出结果是什么?

    >>> $string = '高清贴图将《{$title}》 PC 版的画面';
    => "高清贴图将《{$title}》 PC 版的画面"

    >>> $tit = '战车 2';
    => "战车 2"

    >>> str_replace('{$title}', '$tit', $string);
    => "高清贴图将《$tit 》 PC 版的画面"

    >>> str_replace('{$title}', $tit, $string);
    => "高清贴图将《战车 2 》 PC 版的画面"
    pota
        8
    pota  
       89 天前
    绝了 没细看 你的$title 不是变量啊

    echo str_replace("{\$title}", "$tit", $string) .PHP_EOL;
    echo str_replace('{$title}', "$tit", $string) .PHP_EOL;

    正常情况下都会输出
    => 高清贴图将《战车 2 》 PC 版的画面
    tangknox1
        9
    tangknox1  
    OP
       89 天前
    @pota {$title} 是在文本内容里包含出现的,但是,同时这个 {$title} 又是 CMS 程序里模板引擎的一个标题调用标签,所以我要把他替换成别的。意思就是,必须把 {$title} 转换为文本类型然后用别的替换掉
    tangknox1
        10
    tangknox1  
    OP
       89 天前
    @IceBay 哥,你们单独一个 PHP 文件里测试,肯定没问题,但是 {$title} 虽然是输出的文本内容,可 {$title} 同时也是我这套程序的模板引擎里的一个标题调用标签 {$title} 可以直接输出当前文章的标题。所以必须把这个{$title} 转为文本,然后用别的替换掉。
    gesse
        11
    gesse  
       89 天前
    tangknox1
        12
    tangknox1  
    OP
       89 天前
    @gesse $string 中的文本里出现的 {$title} 同时也是我程序里模板引擎的一个数据标签,所以,我在模板里替换{$title},程序会把它当作数据调用标签,只能想法删除掉他并改成别的 '{$title}' 是不行的,'{$title', 只能这样,去掉后面那个 } ,才行。
    tangknox1
        13
    tangknox1  
    OP
       89 天前
    感谢各位,,我用 echo $str = preg_replace("/\{[^\}]+\}/", "$tit", $string); 正则过滤了 花括号和里面内容,这样搞定了
    gesse
        14
    gesse  
       89 天前   ❤️ 2
    兄弟你如果年龄大于等于 28 岁,我觉得你可以转下产品或者其他岗位。
    gesse
        15
    gesse  
       89 天前
    真心的,我 10 年前开过培训学校,学生上千人, 现在保持联系的也很多。

    从一些细枝末节我能知道一个人适不适合干程序。
    tangknox1
        16
    tangknox1  
    OP
       89 天前
    @gesse 嘿嘿兄弟,我就没学过 PHP ,帖子里我也说了,小白一个,偶尔需要修改下程序里的代码,都是直接百度搜下案例,照着弄,也没看过什么 PHP 手册啥的。所以问的问题挺小白的。
    zpfhbyx
        17
    zpfhbyx  
       89 天前
    试试 strtr?
    fuchish112
        18
    fuchish112  
       88 天前
    <?php
    /**
    * 用上下文信息替换记录信息中的占位符
    */
    function interpolate($message, array $context = array())
    {
    // 构建一个花括号包含的键名的替换数组
    $replace = array();
    foreach ($context as $key => $val) {
    // 检查该值是否可以转换为字符串
    if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
    $replace['{' . $key . '}'] = $val;
    }
    }

    // 替换记录信息中的占位符,最后返回修改后的记录信息。
    return strtr($message, $replace);
    }

    // 含有带花括号占位符的记录信息。
    $message = "User {username} created";

    // 带有替换信息的上下文数组,键名为占位符名称,键值为替换值。
    $context = array('username' => 'bolivar');

    // 输出 "User bolivar created"
    echo interpolate($message, $context);
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2817 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:37 · PVG 20:37 · LAX 05:37 · JFK 08:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.