我有多个.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
那么如何修复正则表达式呢?
答案 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
的所有变体。