【问题标题】:regular expression / preg_match_all with optional matching正则表达式 / preg_match_all 可选匹配
【发布时间】:2013-12-04 02:35:24
【问题描述】:

我正在尝试为我的网站用户创建一个非常简单的模板系统,允许他们将变量添加到他们的内容中。

我想要的是在 php 中运行以下正则表达式:

<p>Hi {{ user.name | fallback="awesome person" }}!</p>

这至少会给我以下物品:

  1. {{ 用户名 | fallback="真棒人" }}
  2. 用户名
  3. 了不起的人

这还需要匹配以下内容:

&lt;p&gt;Your site is {{ site.name }}&lt;/p&gt;

这会给我回报:

  1. {{ 站点名称 }}
  2. 网站名称

我会添加我尝试过的所有东西,但是每次新尝试我基本上都会覆盖上次尝试,正则表达式不是我的强项!

理想情况下,我将对整个内容运行正则表达式,它会返回一个包含所有匹配项的数组,因此我可以循环遍历并将 (1) 替换为 $data[(2)],除非 (2) 没有'不存在,在这种情况下,我将在 (3) 后备中添加。

例如,如果 user.name 存在于我的数组中,则响应为

Hi Frank!

如果不是,则响应为

Hi awesome person!

我可以处理循环/替换等,这是我需要帮助的原始正则表达式,有什么想法吗?

理想情况下,空格也是可选的,即{{user.name|fallback="awesome person"}} 也可以使用

【问题讨论】:

  • 添加您尝试过的最后一件事。我没有看到任何正则表达式尝试:)
  • @Jack 我得到的最可靠的结果与/{{(.*)}}/ 一样原始,当我没有引入后备时,这足以让我得到结果

标签: php regex


【解决方案1】:

一个不错的方法是使用preg_replace_callback():

$txt = 'Hello {{ user.name | fallback="awesome person" }}';

$context = array(
        'user.name' => 'Jack',
);

$re = '/{{\s*([a-z.]+)(?:\s*\|\s*fallback="([^"]+)")?\s*}}/';

echo preg_replace_callback($re, function($match) use ($context) {
        if (isset($context[$match[1]])) {
                return $context[$match[1]];
        } elseif (isset($match[2])) {
                return $match[2];
        } else {
                return '';
        }
}, $txt);

每次文本的一部分与您的表达式匹配时,它将调用一个匿名函数,该函数将根据给定的$context 返回结果。

对表达式的小解释:

/{{\s*([a-z.]+)(?:\s*\|\s*fallback="([^"]+)")?\s*}}/
       ^--+--^ ^------------+-------|--+--|--^
          |                 |          |
          |                 |     (fallback value)
          |                 |
      (variable name) (optional fallback segment)

【讨论】:

  • 天哪,这太不真实了。首先,正则表达式很划算,正是我所追求的。其次,回调功能,棒极了。给你所有的分数!
  • @duellsy 不客气!顺便说一句,您可以将回退简化为 {{ user.name | "Default value" }}。看起来更干净。
  • 该死的我正在研究这个并且想出了几乎完全一样的你所做的,除了我做了一些爆炸和修剪而不是更严格的正则表达式。需要提高我的打字速度。 +1
  • @Jack 更短的版本肯定看起来更好,但我认为尽管“fallback=”部分让用户更清楚地了解如何添加他们的后备
  • @duellsy 这也需要更多的打字和更多的记忆:)
猜你喜欢
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多