【问题标题】:Regex to match {@layout=xxx}正则表达式匹配 {@layout=xxx}
【发布时间】:2017-04-28 15:02:08
【问题描述】:

我正在尝试通过创建自己的模板系统来了解其背后的原理,但我遇到了一个障碍......

我想如下设置我的模板:

{@layout=layoutname}

{@content}
<p>This is a paragraph</p>
{@endcontent}

但我不知道如何匹配{@layout= 并获取布局名称。

我已经尝试过:if (preg_match('/(\{\@layout=[a-z]+\})+/', $string, $matches)) { 可以工作......有点。我想检查是否加载了超过 1 个布局以防止长文件中出现错误,并想计算我有多少 $matches 并在找到超过 1 个匹配项时返回错误,但不是获取所有找到的布局,而是返回相同的布局两次:

使用的字符串:

{@layout=app} 

{@layout=main}

{@content}
    <h1>{[username]} profile</h1>
    <img src="{[photoURL]}" class="photo" alt="{[name]}" width="100" height="100"/>
    <b>Name:</b> {[name]}<br />
    <b>Age:</b> {[age]}<br />
    <b>Location:</b> {[location]}<br />
{@endcontent}

并使用该表达式我得到:

Array ( [0] =&gt; {@layout=app} [1] =&gt; {@layout=app} )

有人可以帮我找到我的正则表达式吗?

【问题讨论】:

  • 您需要使用preg_match_all 来查找多个匹配项。数组中的两项指向整个匹配项 (0) 和匹配项的第一个捕获组 (1)。
  • 那么如何更改它以仅返回布局名称?
  • 还有。 @SebastianProske 您能否将其写为答案,以便我接受? :)

标签: php html regex templates


【解决方案1】:

您需要使用preg_match_all 在同一字符串中获取多个匹配项。在这种情况下,您要检查$matches[1],它将是一组捕获组结果。如果您有多个布局,它将有多个元素,因此如果是这种情况,您就知道有多个布局声明。

我还将您的正则表达式更改为/\{\@layout=([a-z]+)\}/,这将仅捕获布局名称。 $matches 看起来像:

array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(20) "{@layout=layoutname}"
  }
  [1]=>
  array(1) {
    [0]=>
    string(10) "layoutname"
  }
}

所以如果count($matches[1]) &gt; 1,你知道有不止一个布局声明。否则,$matches[1][0] 是您的布局名称。

【讨论】:

  • 谢谢,无论如何都意识到了:D
【解决方案2】:

感谢@SebastianProske,我找到了我想要的东西:

if (preg_match_all('/\{\@layout=([a-zA-Z0-9]+)*\}/', $string, $matches)) {

这是正确的 if,它还返回名称和所有匹配项。

感谢您的宝贵时间, 战神D。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多