繁体   English   中英

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

[英]Regex that matches {{ string|trans }}

我有多个.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

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

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

如果您确定想要的文本中没有} ,那么一个快速解决方案是将[^|]替换为[^|}]

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

顺便说一句,PHP中的Btw不需要转义{如果后面没有数字,或者}如果前面没有数字:请参见demo

我认为带有“ | trans”标记的无需检查“ |” 或“}”,您只需要查找“ | trans”即可,但要使用惰性量词。

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

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


编辑。 更正卡西米尔和希波吕特所说的内容。

该解决方案的优点是在搜索的字符串中没有禁止的字符。

Robin的答案可能更快,但搜索的字符串不能包含“ |” 或“}”字符。

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

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

此正则表达式涵盖:

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

以及所有具有transchoice变种。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM