如何使用 preg_replace 实现带条件的模板

2024-05-14

我正在尝试实现一个管理界面,经理可以在其中创建网站元标记形成的高级规则。

我有一个函数,它采用模板并用 $registry 中的值替换其中的占位符,并在需要时应用修饰符。

$registy = array( 'profession_name' => 'actor', 'total_found' => 100, );

$result = preg_replace_callback('/\{([^{}:]+)(:[^{}:]+)?\}/', function($matches) use ($registry) {

    $result = $registry[$matches[1]] ?: $matches[0];

    if (in_array($matches[2], array(':ucfirst', ':strtolower', ':strtoupper', ':lcfirst')))
    {
        $result = call_user_func(substr($matches[2], 1), $result);
    }

    return $result;
},  
$template);

Example:

职业 {name:ucfirtst} 是 {profession_name:strtoupper}

被划分为

职业名称是演员

我正在尝试实施条件,因此可以制定如下规则:

条件前带有 {placeholdes} 的文本。 [{total_found},带有 {placeholders} 的 TRUE 文本,带有 {placeholders} 的 FALSE 文本],条件后带有 {placeholders} 的尾随文本。

因此,我的函数将从注册表中获取 {total_found} 值,并根据它是 true 还是 false 将返回具有相应 false 或 true 模式的字符串。 我不擅长正则表达式,并且不知道如何用正则表达式术语编写这个条件。 请帮帮我。

更新: 具体示例如下所示:

$template = 'Profession is {profession_name}. [{total_found}, {total_found} vacancies found, No vacancies found]. {profession_name} in your town';

在我的回调函数中我会放置一个像这样的条件

if ($matches[condition]) // i don't no how exactly 
  $result = $matches[true-condition];
else
  $result = $matches[false-condition]

所以万一$registry['total_found'] = 100;最终结果将是“职业是演员”。已找到 100 个职位空缺。你镇上的演员»。 以防万一$registry['total_found'] = 0;最终结果将是“职业是演员”。没有找到职位空缺。你镇上的演员»。


$available_functions = array('ucfirst', 'strtolower', 'strtoupper', 'lcfirst');
$registry = array( 'profession_name' => 'actor', 'total_found' => 100, );
$template = 'Profession {"is":strtoupper} {profession_name:strtoupper:lcfirst}. [{total_found}, {total_found} vacancies found, No vacancies found]. {profession_name} in your town';

$pattern = <<<'EOD'
~
(?=[[{])  # speed up the pattern by quickly skipping all characters that are not
          # a "[" or a "{" without to test the two branches of the alternation 
(?:
    # conditional
    \[
      { (?<if> [^}]+ ) } ,   
        (?<then> [^][,]* )
        (?:, (?<else> [^][]* ) )?
     ]
  |
     # basic replacement
     (?<!\[) # allow nested conditionals           
     {
        (?<var_name> [^{}:]+ )
        (?: : (?<func_name> [^{}:]+ ) )? # first function to apply
        (?: (?<other_funcs> : [^}]+ ) )? # allow to chain functions
     }
)  
~x
EOD;

$replacement = function ($m) use ($registry, $available_functions) {
    if (!empty($m['if'])) {
        $cond = $m['if'];

        # when the condition doesn't exist, the string is evaluated as it
        if (isset($registry[$cond]))
            $cond = $registry[$cond];

        return $cond ? $m['then'] : $m['else'];

    } else {
        $value = isset($registry[$m['var_name']]) ? $registry[$m['var_name']] : trim($m['var_name'], '"\'');  

        if (isset($m['func_name'])) {
            $func = trim($m['func_name']);

            if (in_array($func, $available_functions))
                $value = call_user_func($func, $value);
        }

        if (isset($m['other_funcs']))
            return '{\'' . $value . '\'' . $m['other_funcs'] . '}';

        return $value;
    }
};

$result = $template;

do {
    $result = preg_replace_callback($pattern, $replacement, $result, -1, $count);
} while ($count);

echo $result;

当满足条件时,首先用好的分支进行替换,然后再进行分支内部的替换。这就是为什么preg_replace_callback是在一个do...while环形。另一个原因是允许链式函数。

请注意,除了速度和可读性方面的小改进之外,该模式不需要使用特殊功能。

我添加了一些改进,例如默认行为(当在注册表中找不到某些内容时)、使用链式函数和文字字符串的能力。显然,您可以根据需要将它们更改为英尺。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 preg_replace 实现带条件的模板 的相关文章

  • 在php中设置数据库中的会话

    如何使用 php 和 mysql 在数据库表中使用会话 您需要创建一个像这样的对象 class SessionHandler private static lifetime 0 private function construct obje
  • 通过 exec() 的 Crontab 不适用于 PHP 7.4 / Deb 10

    调试有点困难 因为我正在使用新版本的 PHP 和新服务器上的新操作系统 我有一个 PHP 的 cron 管理系统 它也允许我添加 删除或启用 禁用 cronjobs 在另一台当前使用 PHP 7 2 的 Deb 8 服务器上 它可以使用以下
  • Swift 中的 preg_match 等效项

    我尝试将 PHP 函数转换为 Swift 该函数用于根据 my 正则表达式将字符串格式化为另一个字符串 这就是我在 PHP 中所做的 preg match P 0 9 Y 0 9 M 0 9 D T 0 9 H 0 9 M 0 9 0 9
  • StrRev() 不支持 UTF-8 [重复]

    这个问题在这里已经有答案了 我正在尝试编写一个代码来替换非阿拉伯支持的程序中支持的阿拉伯文本因为我需要在替换后反转文本 但它显示一些垃圾内容而不是想要的结果 这是代码 结果 After Reverse 我需要它是原来的样子 但相反 不是垃圾
  • 传递表单变量的安全方式

    我正在为我的 WordPress 主题构建联系表单 我希望能够从后端输入接收者地址 目前我正在传递带有隐藏输入字段的变量
  • Gmail 搜索怎么这么快?

    搜索这么多字符的最有效方法是什么 你怎么认为 假设网站是用 PHP 和 MySQL 构建的 我应该学习什么才能尽可能有效地构建它 有什么我应该学习的算法吗 文本索引算法 https stackoverflow com questions 4
  • while 循环中 regex.exec() 赋值的更好解决方案

    这里有更好的解决方案吗 我尽量避免里面的作业while但仍然能够循环匹配并使用捕获的组 var match var CSS URL PATTERN url s s s s gm while match CSS URL PATTERN exe
  • Javascript拆分正则表达式问题

    你好 我正在尝试我认为在 Javascript 中相当简单的正则表达式 但给我带来了很多麻烦 我希望能够通过 javascript 通过 和 分割日期 var date 02 25 2010 var myregexp2 new RegExp
  • 避免刷新时上传图片

    我正在使用最简单的图像上传形式 我非常希望保持这种方式 只需要一些 php 代码看起来像这样
  • PHP、in_array 和数组中的快速搜索(到最后)

    我对在数组中进行快速搜索的更好方法有疑问 我正在谈论一个特定的情况 假设我有一个数组 L A B C 当我开始时 当程序运行时 L 可能会增长 但到最后 当我进行搜索时 一个可能的原因是 L A B C D E 事实是 当我搜索时 我想要找
  • 美化html输出

    我想知道是否有类或类似的东西可以包含在我的 PHP 页面中以美化 HTML 输出 例如在标签后添加新行并正确缩进 以便我的源代码不仅仅是一行 我知道对于浏览器来说这并不重要 但我希望这样做 我听说过http www php net manu
  • sed 中的正则表达式用于在一条语句中进行多个替换

    我想清理一些输入并用可接受的输入替换几个字符 例如一个丹麦人 with aa 使用多个语句可以轻松完成此操作 例如 ae aa oe 但由于工具限制 我希望能够在单个正则表达式中完成此操作 我可以捕获所有相关案例 但我的替换不能按我想要的方
  • 用于匹配重复子字符串的单个js正则表达式?

    假设我有一个字符串 例如 where is mummy where is daddy 我想用空字符串替换任何一组重复子字符串 所以在这种情况下where and is元素将被删除 结果字符串将是 mummy daddy 我想知道是否有任何单
  • 根据用户的时间设置问候语(早上好,下午好......)

    任何人都可以推断如何根据用户的时间设置实现基本的 晚上好 或 早上好 也许 PHP 会获取服务器时间 但我希望用基于时间的适当问候语来问候网站访问者 并考虑到他们一天中的时间 E G 早上好 晚上好 下午好 基于它 getHours 日期对
  • Yii:使用与控制器布局不同的布局渲染动作

    在 Yii 中 有没有办法使用不同的方式渲染单个动作layout比为控制器定义的值 我有一个操作希望其格式与其他操作不同 并且文档中不清楚这是否可能 我相信您可以调用该操作 layout多变的 public function actionY
  • 下载网址在 Google Drive API PHP 中不起作用

    我在使用 Google Drive API 时遇到问题 我能够使用 API 获取文件 但无法通过此链接下载 我想 必须进行一些身份验证 但我已使用刷新令牌进行身份验证 请参阅下面的代码 this gt load gt library goo
  • 正则表达式匹配 JWT

    我没有正则表达式的经验 我请求你的帮助 我需要一个正则表达式来捕获以下字符串中的 JWT contextJwt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 eyJzdWIiOiJIZWxsbyB5b3UiLCJ
  • 如何只允许从我的 iOS 应用程序访问我的 MySQL 数据库? (使用webapp作为数据库的网关)

    我的 iOS 应用程序需要连接到 mysql 服务器 为了实现这一目标 我想创建一个 Web 应用程序 充当客户端应用程序和服务器端数据库之间的中间人 我担心的是 有人可以简单地找出我的应用程序使用的 URL 并传递他们自己的 URL 参数
  • APC 将数据存储在哪里?

    我想用apc store 缓存一些结果 但我需要知道数据将存储在哪里 以及限制是什么 它总是存储在内存中吗 或者也写入磁盘 我希望将不经常访问的数据存储在磁盘上 我应该为此使用不同的缓存系统吗 这就是极限了吗 apc shm size 32
  • cUrl 在本地主机上工作正常,但在服务器上不起作用,仅显示空白页面

    当我在服务器上运行以下代码时 它只显示空白页面并突然停止进一步执行 我还检查了已安装的服务器上的 cUrl 这是我的代码 ftp server ftps server Voorraadtonen link csv ch curl init

随机推荐