正则表达式preg_match_all介于特定函数之间

时间:2014-10-05 14:28:20

标签: php regex translation preg-match-all

我创建了一个语言类,它在通过函数时自动转换字符串。我现在正在开发一个工具,它允许我提取所有这些文本片段并将它们保存到一个可以单独翻译的文件中,尽管我在使用正则表达式匹配引号之间的文本时遇到了一些麻烦。

html示例:

 <h1><?=$Lang->t("Example text")?></h1>
 <h1><?=$Lang->t("Example (text)")?></h1>
 <h1><?=$Lang->t("Example %s", 'text')?></h1>

输出示例:

Example text
Example (text)
Example %2

应排除第3个示例中传递的参数,就像上一个示例输出

中所示

注意:这应该忽略任何页面上的所有其他内容,javascript,jQuery,Php等等。

有人可以对此有所了解吗? :)

2 个答案:

答案 0 :(得分:0)

为什么不使用已经为您做的事情?的getText

http://www.sitepoint.com/localizing-php-applications-1/

答案 1 :(得分:0)

快速而肮脏的解决方案将是这样的表达式:

$re = <<<'re'
    /
        \$Lang->t\(
            (
                " ( (?: \\. | [^"] )* ) "
                |
                ' ( (?: \\. | [^'] )* ) '
            )
    /x
re;

基本上,匹配$Lang->t(后跟单引号或双引号字符串,与转义相关。用法如下:

$code = <<<'eof'
<h1><?=$Lang->t("Example text")?></h1>
<h1><?=$Lang->t("Example (text)")?></h1>
<h1><?=$Lang->t("Example %s", 'text')?></h1>
<h1><?=$Lang->t("Example\"foo\"", 'text')?></h1>
<h1><?=$Lang->t('Example\'foo\'', 'text')?></h1>
eof;

preg_match_all($re, $code, $m, PREG_SET_ORDER);
print_r(array_map('end', $m));

这不是防弹,因为正则表达式无法完全解析编程语言,但在大多数情况下都能正常工作。

相关问题