匹配{{string | trans}}的正则表达式

时间:2014-04-10 08:38:21

标签: php regex twig

我有多个.phtml文件,我想在| trans}}之前选择所有字符串,而不是{{在字符串之前。

像这样:

{% block title %}{{ 'Detail Hostess:'|trans }} {{ host.Name }}{% endblock %}

现在我想选择'Detail Hostess:'。这是我现在的正则表达式:

/\{{2}\s*([^|]+)\|trans\s*\}{2}/i

有时它有效,但在上面的情况下,他选择'Detail Hostess:'
host.Name }}{% endblock %} {% block content

那么如何修复正则表达式呢?

3 个答案:

答案 0 :(得分:4)

您的问题可能与以下事实有关:当您使用[^|]+时,没有什么可以阻止您离开{{...}}构造:您的正则表达式将匹配host.Name }}{{ 'Detail Hostess:' {{ host.Name }}{{ 'Detail Hostess:'|trans }} 1}}。

如果您确定所需文字中没有},则快速修复会将[^|]替换为[^|}]

{{\s*([^|}]+)\|trans\s*}}

PHP中的顺便说一下,如果{后面没有数字,则无需转义},如果没有数字,则{{1}}也不需要转义:demo

答案 1 :(得分:0)

我认为拥有" | trans"标记,没有必要检查" |"或者"}",您只需要寻找" | trans",但使用惰性量词。

/{{\s*(.+?)\|trans\s*}}/i

测试: http://www.phpliveregex.com/p/4Ly


编辑。更正了 Casimir et Hippolyte 所说的内容。

此解决方案的优点是搜索字符串中没有禁用字符。

罗宾的回答可能会更快,但搜索到的字符串不能包含" |"或"}"字符。

答案 2 :(得分:0)

感谢@Robin。这是我最终用于解析Twig中的翻译过滤器的表达式:

{{([^}]+)\|(?:transchoice\((.*?)\)|transchoice|trans|trans\((.*?)\))(?:\|([^}]+)|\s*)}}

此RegEx涵盖:

{{ 'foo'|trans }}
{{ 'foo %variable%'|trans({'%variable%':'foo'}) }}
{{ 'foo'|humanize|trans }}
{{ 'foo %variable%'|trans({'%variable%':'foo'})|capitalize }}

以及transchoice的所有变体。