[英]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.