【发布时间】:2015-03-12 19:21:04
【问题描述】:
我使用函数__() 翻译字符串,并添加了一个接口来自动查找所有文件中的所有论文翻译。这(应该是)使用以下正则表达式完成:
<?php
$pattern = <<<'LOD'
`
__\(
(?<quote> # GET THE QUOTE
(?<simplequote>') # catch the opening simple quote
|
(?<doublequote>") # catch the opening double quote
)
(?<param1> # the string will be saved in param1
(?(?=\k{simplequote}) # if condition "simplequote" is ok
(\\'|"|[^'"])+ # allow escaped simple quotes or anything else
| #
(\\"|'|[^'"])+ # allow escaped double quotes or anything else
)
)
\k{quote} # find the closing quote
(?:,.*){0,1} # catch any type of 2nd parameter
\)
# modifiers:
# x to allow comments :)
# m for multiline,
# s for dotall
# U for ungreedy
`smUx
LOD;
$files = array('/path/to/file1',);
foreach($files as $filepath)
{
$content = file_get_contents($filepath);
if (preg_match_all($pattern, $content, $matches))
{
foreach($matches['param1'] as $found)
{
// do things
}
}
}
该正则表达式不适用于某些包含转义的简单引号 (\') 的双引号字符串。事实上,无论字符串是简单的还是双引号的,条件都被认为是假的,所以总是使用“else”。
<?php
// content of '/path/to/file1'
echo __('simple quoted: I don\'t "see" what is wrong'); // do not work.
echo __("double quoted: I don't \"see\" what is wrong");// works.
对于 file1,我希望找到两个字符串,但只有双引号有效
编辑添加了更多的 php 代码,以便于测试
【问题讨论】:
-
您能否发布一些有效和无效的示例以及预期的输出?
-
看看stackoverflow.com/questions/6243778/… 上面的答案提供了一个关于如何捕获转义序列的示例。
-
我刚刚编辑了 @AvinashRaj 。我希望这就足够了
标签: php regex internationalization