【问题标题】:Replace variable texts with regular expressions用正则表达式替换可变文本
【发布时间】:2015-02-27 13:10:33
【问题描述】:

我正在重新编写我的一个旧程序并使用 TextCrawler 自动替换多个代码文件中的文本,但我正在努力进行以下更改:

我需要找到所有“文本”函数(示例):

$object->text('TRANSLATE_KEY_A')
$object->text('TRANSLATE_KEY_B')
...

并将它们替换为(示例):

__('RETURNED_TEXT_FROM_TRANSLATE_KEY_A', TEXT_DOMAIN)
__('RETURNED_TEXT_FROM_TRANSLATE_KEY_B', TEXT_DOMAIN)
...

RETURNED_TEXT_FROM_TRANSLATE_KEY_X 在另一个代码文件中使用'text' 数组的键设置

array_push($text, array('key' => 'TRANSLATE_KEY_A',
                        'extras' => '',
                        'text' => 'Translated Text A'));

array_push($text, array('key' => 'TRANSLATE_KEY_B',
                        'extras' => '',
                        'text' => 'Translated Text B'));

最终结果应该是:

$object->text('TRANSLATE_KEY_A')
$object->text('TRANSLATE_KEY_B')
...

替换为

__('Translated Text A', TEXT_DOMAIN)
__('Translated Text B', TEXT_DOMAIN)
...

其中有 1500 多个 :( 是否可以使用 TextCrawler 中的正则表达式来实现这一点,以及如何实现?还是有其他想法?谢谢

【问题讨论】:

    标签: php regex replace


    【解决方案1】:

    如果您想使用 php 数组来提供替换数据,最好只使用 php 本身来完成任务。

    例如script.php:

    // your $text array
    $text = array();
    array_push($text, array(
        'key' => 'TRANSLATE_KEY_A',
        'extras' => '',
        'text' => 'Translated Text A')
    );
    array_push($text, array(
        'key' => 'TRANSLATE_KEY_B',
        'extras' => '',
        'text' => 'Translated Text B')
    );
    ...
    
    // create a separate array from your $text array for easy lookup
    $data_arr = array();
    foreach ($text as $val) {
        $data_arr[$val['key']] = $val['text'];
    }
    
    // your code file, passed as first argument
    $your_code_file = $argv[1];
    
    // open file for reading
    $fh = fopen($your_code_file, "r");
    if ($fh) {
        while (($line = fgets($fh)) !== false) {
            // check if $line has a 'text' function and if the key is in $data_arr
            // if so, replace $line with the __(...) pattern
            if (preg_match('/^\$object->text\(\'([^\']+)\'\)$/', $line, $matches)
                && isset($data_arr[$matches[1]])) {
                printf("__('%s', TEXT_DOMAIN)\n", $data_arr[$1]);
            } else {
                print($line);
            }
        }
        fclose($fh);
    } else {
        print("error while opening file\n");
    }
    

    呼叫:

    php script.php your_code_file
    

    只需添加功能以迭代所有代码文件并写入相应的输出文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-18
      • 2014-03-11
      • 2017-01-21
      • 2019-11-29
      • 2016-08-02
      • 2020-05-08
      相关资源
      最近更新 更多