php - 编写表达式以递归地提取括号之间的数据

标签 php regex recursion tokenize

我正在尝试编写一个正则表达式,将字符串拆分为匹配花括号内的单独元素。首先,它需要递归,其次,它必须返回偏移量(与 PREG_OFFSET_CAPTURE 一样)。

我实际上认为这可能是处理这些数据的一种效率较低的方法,但我不确定是否有一种更简单、性能更高的技术。 (如果你有,我很想听听!)

因此,输入可以采用以下格式:

Hello {#name}! I'm a {%string|sentence|bit of {#random} text}

如果数据是这种格式,处理数据就足够容易了:

Hello {#name}! I'm a {%string|sentence|bit of random text}

但是,处理时的问题是另一组花括号中的递归花括号。 我正在使用以下代码拆分字符串:

preg_match_all("/(?<={)[^}]*(?=})/m", $string, $braces, PREG_OFFSET_CAPTURE);

如前所述,简单的形式非常好。对于更复杂的形式,情况就更少了。这样做的目的(我让它以非递归形式运行)是用函数处理的内容替换每个括号内的区域,向上工作。

理想情况下,我希望能够编写 Hello {#name}!我是 {%string|sentence|bit of {?(random == "strange") ? {#random} : "strange"}} text 并且易于管理。

非常感谢任何帮助。

最佳答案

您可以利用 PCRE 正则表达式在前瞻和子例程中捕获组的能力来获取嵌套的 {...} 子字符串。

A regex demo is available here .

$re = "#(?=(\{(?>[^{}]|(?1))*+\}))#"; 
$str = "Hello {#name}! I'm a {%string|sentence|bit of {#random} text}"; 
preg_match_all($re, $str, $matches, PREG_OFFSET_CAPTURE);
print_r($matches[1]);

参见 IDEONE demo

它将返回一个包含捕获的类似 {...} 的字符串及其位置的数组:

Array
(
    [0] => Array
        (
            [0] => {#name}
            [1] => 6
        )

    [1] => Array
        (
            [0] => {%string|sentence|bit of {#random} text}
            [1] => 21
        )

    [2] => Array
        (
            [0] => {#random}
            [1] => 46
        )

)

关于php - 编写表达式以递归地提取括号之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30445112/

相关文章:

recursion - 从递归函数的基本情况返回语句 (Python)

java - 字符串的子序列

c++ - boost 非结构化字符串的 regex_search

php - 从字符串中提取美元金额 - PHP 中的正则表达式

JAVA:递归方法是检查 json 是否包含具有特定数据值的特定键的最佳方法吗?

php - PDO 不接收名为 sp 的表格

ios - Sqlite 查询也可以获取带有相邻词的搜索词

php - 计算 MySQL 中的特定行数

php - 我应该如何将盐合并到我的密码哈希中?

php - (PHP/MYSQL) 插入大值时,Insert Into 不起作用,没有超时或错误