使用正则表达式从文本中获取多个字符串

时间:2013-12-29 16:13:12

标签: php regex

我在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},但它没有使用此函数。如何仅从函数中获取字符串?

2 个答案:

答案 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);

Regex101 demo.

答案 1 :(得分:1)

你的正则表达式是指定一个下划线,后跟2-3个下划线,因为你在正则表达式中输入了2个不需要的值。如果您有__ {2,3},请将其更改为_ {2,3}。

另外,要匹配,或;通话结束后,您需要[,;]而不是,|;。最后,你想通过添加一个?来使括号内的任何内容保持懒惰(因此它将停在第一个右括号而不是覆盖第二个调用)。它。

解决方案:preg_match_all('#(_{2,3}(\((.*?)\)[,;]))#',$text, $matches)