【问题标题】:Regex preg_match_all in between a specific function正则表达式 preg_match_all 在特定函数之间
【发布时间】:2014-10-05 14:28:19
【问题描述】:

我创建了一个语言类,它在通过函数时自动翻译字符串。我现在正在开发一个工具,它可以让我提取所有这些文本的 sn-ps 并将它们保存到一个准备单独翻译的文件中,尽管我在使用正则表达式仅匹配引号之间的文本时遇到了一些问题。

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

第三个示例中传递的参数应该被排除,就像上一个示例输出中显示的那样

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

有人可以解释一下吗? :)

【问题讨论】:

    标签: php regex translation preg-match-all


    【解决方案1】:

    为什么不使用已经为您完成的内容?获取文本

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

    【讨论】:

    • 我知道这一点,我的系统工作方式相同,我只是更喜欢我的 :)
    【解决方案2】:

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

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

    基本上,匹配$Lang-&gt;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));
    

    这不是万无一失的,因为正则表达式无法完全解析编程语言,但在大多数情况下都可以正常工作。

    【讨论】:

    • 感谢您的回复!是的,这正是我需要的,我试过你的正则表达式(我只想要双引号方法)我试过: $re = "t((\" ( (?: \\ . | [^\"] )* ) \")/x re;"; 但是我尝试的每一个方法,我都会得到 php 错误,你知道吗?
    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多