用正则表达式替换变量文本
Replace variable texts with regular expressions
我正在重新编写我的一个旧程序并使用 TextCrawler 自动替换多个代码文件中的文本,但我正在努力进行以下更改:
我需要找到所有 'text' 函数(示例):
$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 数组来提供替换数据,最好只使用 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[]);
} else {
print($line);
}
}
fclose($fh);
} else {
print("error while opening file\n");
}
致电:
php script.php your_code_file
只需添加迭代所有代码文件并写入相应输出文件的功能。
我正在重新编写我的一个旧程序并使用 TextCrawler 自动替换多个代码文件中的文本,但我正在努力进行以下更改:
我需要找到所有 'text' 函数(示例):
$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 数组来提供替换数据,最好只使用 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[]);
} else {
print($line);
}
}
fclose($fh);
} else {
print("error while opening file\n");
}
致电:
php script.php your_code_file
只需添加迭代所有代码文件并写入相应输出文件的功能。