【发布时间】:2013-08-05 11:02:23
【问题描述】:
我有以下 LaTeX 命令:
\autocites[][]{}[][]{}
[] 中的参数是可选的,{} 中的其他参数是必需的。 \autocites 命令可以通过额外的参数组进行扩展,例如:
\autocites[a1][a2]{a3}[b1][b2]{b3}
\autocites[a1][a2]{a3}[b1][b2]{b3}[c1][c2]{c3}
...
也可以这样使用:
\autocites{a}{b}
\autocites{a}[b1][]{b3}
\autocites{a}[][b2]{b3}
...
我想通过在 PHP 中使用正则表达式来提取它的参数。这是我的第一次尝试:
/\\autocites(\[(.*?)\])(\[(.*?)\])(\{(.*?)\})(\[(.*?)\])(\[(.*?)\])(\{(.*?)\})/
虽然如果\autocites 只包含两组三个参数,这可以正常工作,但我无法弄清楚如何让它为未知数量的参数工作。
我也尝试使用以下表达式:
/\\autocites((\[(.*?)\]\[(.*?)\])?\{(.*?)\}){2,}/
这一次我能够匹配更多的参数,但我无法提取所有值,因为 PHP 总是只给我最后三个参数的内容:
Array
(
[0] => Array
(
[0] => \autocites[a][b]{c}[d][e]{f}[a][a]{a}
)
[1] => Array
(
[0] => [a][a]{a}
)
[2] => Array
(
[0] => [a][a]
)
[3] => Array
(
[0] => a
)
[4] => Array
(
[0] => a
)
[5] => Array
(
[0] => a
)
)
非常感谢任何帮助。
【问题讨论】:
-
匹配整个命令可能更简单,包括随机的
(\{.\}|\[.\])*变体。然后使用第二个preg_match_all提取各个参数。或者使用?(DEFINE)或至少/x修饰符来制作可管理的正则表达式。
标签: php regex preg-match-all