1

我有一系列形式的字符串:

{ method_name { $key1 = 'quoted value' , $key2 = __('literal value'); }}

// Missing method_name and final semi-colon
// Still valid
{{ $key1 = 'quoted value' , $key2 = __('literal value') }}

// Optional key values
{ method_name { $key1 = , $key2 = __('literal value'); }}
{ method_name { $key1, $key2 = __('literal value'); }}

// Any number of values
{ method_name { $key1 = 'quoted value' , $keyN = 3.14; }}

目前,我使用一系列preg_splittrim。这是自定义模板引擎的一部分,它method_name通知解析器调用哪个方法,$key = value并将作为数组传递给该方法。这些字符串嵌入在 HTML 模板中,并且可以重复该 DOM 结构。把它想象成一个表,每一行/列都有不同的值。键是列详细信息(名称、可排序等),该方法将填写单元格的详细信息。

我遇到的问题是速度。

Q1。我怎样才能用一个表达式做到这一点?

Q2。我会获得任何速度吗?

Q3。如果我缓存了结果,可读性是否优于有点复杂的正则表达式?

Q4。有什么办法可以重组字符串以提高性能?

理想情况下,我只想扫描字符串一次,将其转换为 PHP 代码,并在eval每次需要使用时执行一次。

4

2 回答 2

1

我可能会使用这样的正则表达式(我从评论中找到了一些可以简化的部分):

(?:\{ (?:(?<method>.+?)\s+\{)?|\G)[,\s]*(?<key>\$\w+)(?: = (?<value>[^,\n;}]*))?

命名的捕获组是不言自明的,但这里有一个细分:

(?:
    \{ 
    (?:
        (?<method>.+?)   # Captures everything until the next { for the method
        \s+\{       
    )?                   # All this optional
    |
    \G                   # Or \G anchor, which will allow successive match of multiple key/value pairs
)
[,\s]*                   # Any spaces and commas
(?<key>\$\w+)            # Capture of key with format $\w+
(?: = 
    (?<value>[^,\n;}]*)  # Capture of value
)?                       # All this optional

正则表达式101演示

于 2013-10-09T20:15:29.770 回答
0

您的性能问题可能会被误导。您似乎认为您的正则表达式匹配需要很长时间。大概您拥有的程序花费的时间比您想要的要长。

不要去优化你的正则表达式,除非你发现它们实际上是你的速度问题的原因。要查明是否是这种情况,您需要使用XDebug之类的代码分析器来分析您的程序并创建一个报告,向您展示什么是缓慢的。

您可能会发现您的程序需要 20 秒才能运行,其中 2 秒用于正则表达式。即使将正则表达式匹配的执行时间减半,也只能节省 1 秒,即 5% 的运行时间。

在不知道代码的哪一部分花费的时间最多的情况下尝试加速代码是不成熟的优化。

于 2013-10-09T19:51:22.980 回答