我在PHP文件中有以下字符串集。
echo '<div class="alert"><b>',__('ERROR!'),'</b> ',__('Please fix following errors!'),'</div>';
echo sprintf(__('hello %s'), $name);
___('Hello');
__()
函数返回字符串,___()
函数echo是一个字符串。我写了一个正则表达式来抓取__('')
或___('')
之间的文字,但它无法正常工作。
这是我的正则表达式
if(preg_match_all("#(__{2,3}(\((.*)\),|;))#",$text, $matches))
我得到的输出是:
__('ERROR!'),' ',__('Please fix following errors!'), (Incorrect result)
__('hello %s'),
对于___()
函数,我使用的是量词_ {2,3},但它没有使用此函数。如何仅从函数中获取字符串?
答案 0 :(得分:1)
您正在使用__{2,3}
。 a{n,m}
在n和m次之间重复上一项。因此__{2,3}
匹配下划线,后跟2或3个下划线。您尝试匹配重复2或3次的下划线,因此请改用_{2,3}
。
然后,您使用,|;
来匹配逗号或分号。这不像你期望的那样工作。 |
用于指定替代方案。例如,(foo|bar)
匹配foo
或 bar
。在正则表达式中,您使用的是(\((.*)\),|;)
,这意味着匹配\((.*)\),
或;
- 这不是您想要的。要匹配,
或;
,请使用字符类 - [,;]
。
(.*)
贪婪,会尽可能多地匹配字符。如果您对字符串a.*c
使用正则表达式abcabc
,则它将匹配整个字符串abcabc
。但a.*?c
只会匹配第一个abc
。通过在?
之后添加*
,我们会尽可能多地重复它。
正确的正则表达式是:
preg_match_all('#_{2,3}\([\'"](.*?)[\'"]\)[,;]#', $text, $matches);
答案 1 :(得分:1)
你的正则表达式是指定一个下划线,后跟2-3个下划线,因为你在正则表达式中输入了2个不需要的值。如果您有__ {2,3},请将其更改为_ {2,3}。
另外,要匹配,或;通话结束后,您需要[,;]
而不是,|;
。最后,你想通过添加一个?来使括号内的任何内容保持懒惰(因此它将停在第一个右括号而不是覆盖第二个调用)。它。
解决方案:preg_match_all('#(_{2,3}(\((.*?)\)[,;]))#',$text, $matches)