【问题标题】:Matching text between braces in PHPPHP中大括号之间的匹配文本
【发布时间】:2011-06-19 08:34:41
【问题描述】:

直接跟进之前的question,我如何使用 PHP 将文本(如果可能的话,以及大括号)作为匹配项提取出来?

具体来说,我正在编写一个 Wordpress 插件,并希望重新格式化两个大括号之间的所有文本(准 wiki 标记)。

我已经按照我之前问过的另一个 question 中概述的步骤进行操作,并且 matching 部分正在工作 - 这是我需要帮助的 match。 p>

例子:

This is some {{text}} and I want to reformat the items inside the curly braces

期望的输出:

This is some *Text fancified* and I want to reformat the items inside the curly braces

我所拥有的(即工作):

$content = preg_replace('#\b\{\{`.+`\}\}\b#', "<strong>$0</strong>", $content);

如果匹配包括大括号太难,我可以使用大括号作为偏移量进行匹配,然后也可以使用更简单的文本匹配函数删除“违规”大括号。

【问题讨论】:

    标签: php regex plugins wordpress


    【解决方案1】:
    $content = preg_replace('/{([^{}]*)}/', "<strong>$1</strong>", $content);
    

    【讨论】:

    • 你需要改变 {something} ,所以你把 {} ,现在你需要用 (.*) 得到里面的东西,但你不需要里面的东西是 { 或 } ,所以你只需说 (除 { 或 } 之外的任何内容) .. 不喜欢 [ { 或 } ] = ^[{|}] 。我很讨厌解释事情,只要我完成工作,我的老板就不会在意......
    • [^{|}] 应该只是 [^{}]。字符类中不需要“或”运算符,因此| 失去了它的特殊含义,只匹配|
    【解决方案2】:

    你需要使用(圆括号)组成一个匹配组。

    preg_replace('#\{\{(.+?)\}\}#', "<strong>$1</strong>",
    

    无论(.+?) 匹配什么,都可以在替换字符串中用作$1。这样,您就可以将封闭的 {{ 和 }} 排除在外。 \b 也是多余的。

    【讨论】:

    • 我从未听说过称为“圆括号”的括号。但除此之外,+1
    • @warren:Ronans 匹配模式更能抵御错误混合的大括号。虽然.+? 通常足以匹配最短的字符串,但[^}]+ 否定字符类是更专业的习语。但是,在您的情况下,我认为它可以互换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多