如何在 php 中的预定义字符串之间提取文本
How to extract text between predefined strings in php
我们正在将翻译系统从 GetText 更改为 MYSQL 数据库。
我想将原始“.po”文件中的所有翻译字符串和翻译 ID 放入数据库。
为此我需要读取文件并遍历每一行,这很容易。
困难的部分是当我看到 "msgid" 或 "msgstr" 时,我需要提取数据并将其插入数据库。
原始文件如下所示:
msgid "inactive_ad_detail_text"
msgstr "This ad doesn't exists"
msgid "breadcrumb_search"
msgstr "Search the site"
(... etc etc ...)
如何提取 id (msgid) 的名称和引号之间的文本 (msgstr)?
此外,我有一些转义文本和两行文本,例如:
msgid "question_fill_form"
msgstr ""
"Please fill the form"
"<br>All fields are mandatory"
或
msgid "offer_contact_error"
msgstr ""
"Error detected "
"please click \"<em>restart</em>\" on the right side."
我想我需要检测 [msgid "] 行尾前的最后一个 ["] 引号,但我真的不知道如何在 PHP 中实现。
感谢您的帮助,
廖
有一个图书馆。
PHP-po-parser
// Parse a po file
$fileHandler = new Sepia\FileHandler('es.po');
$poParser = new Sepia\PoParser($fileHandler);
$entries = $poParser->parse();
// $entries contains every entry in es.po file.
// Update entries
$msgid = 'Press this button to save';
$entries[$msgid]['msgstr'] = 'Pulsa este botón para guardar';
$poParser->setEntry($msgid, $entries[$msgid]);
// You can also change translator comments, code comments, flags...
如果您不使用 composer,您可以按顺序包含文件或使用自动加载器加载这些文件。
require_once('Sepia/InterfaceHandler.php');
require_once('Sepia/StringHandler.php');
require_once('Sepia/FileHandler.php');
require_once('Sepia/PoParser.php');
使用file
、strpos
和substr
函数的解决方案:
假设输入文件 msgdata
包含以下内容:
msgid "question_fill_form"
msgstr ""
"Please fill the form"
"<br>All fields are mandatory"
msgid "offer_contact_error"
msgstr ""
"Error detected "
"please click \"<em>restart</em>\" on the right side."
连续处理:
$lines = file('msgdata');
$result = [];
foreach ($lines as $k => $line) {
if (strpos($line, 'msgid') === 0) {
$result[] = ['msgid' => substr($line, strpos($line, ' '))];
} elseif (strpos($line, 'msgstr') === 0) {
$result[count($result)-1]['msgstr'] = substr($line, strpos($line, ' '));
} else {
$result[count($result)-1]['msgstr'] .= $line;
}
}
print_r($result);
输出:
Array
(
[0] => Array
(
[msgid] => "question_fill_form"
[msgstr] => ""
"Please fill the form"
"
All fields are mandatory"
)
[1] => Array
(
[msgid] => "offer_contact_error"
[msgstr] => ""
"Error detected "
"please click \"restart\" on the right side."
)
)
我们正在将翻译系统从 GetText 更改为 MYSQL 数据库。 我想将原始“.po”文件中的所有翻译字符串和翻译 ID 放入数据库。
为此我需要读取文件并遍历每一行,这很容易。 困难的部分是当我看到 "msgid" 或 "msgstr" 时,我需要提取数据并将其插入数据库。
原始文件如下所示:
msgid "inactive_ad_detail_text"
msgstr "This ad doesn't exists"
msgid "breadcrumb_search"
msgstr "Search the site"
(... etc etc ...)
如何提取 id (msgid) 的名称和引号之间的文本 (msgstr)?
此外,我有一些转义文本和两行文本,例如:
msgid "question_fill_form"
msgstr ""
"Please fill the form"
"<br>All fields are mandatory"
或
msgid "offer_contact_error"
msgstr ""
"Error detected "
"please click \"<em>restart</em>\" on the right side."
我想我需要检测 [msgid "] 行尾前的最后一个 ["] 引号,但我真的不知道如何在 PHP 中实现。
感谢您的帮助, 廖
有一个图书馆。 PHP-po-parser
// Parse a po file
$fileHandler = new Sepia\FileHandler('es.po');
$poParser = new Sepia\PoParser($fileHandler);
$entries = $poParser->parse();
// $entries contains every entry in es.po file.
// Update entries
$msgid = 'Press this button to save';
$entries[$msgid]['msgstr'] = 'Pulsa este botón para guardar';
$poParser->setEntry($msgid, $entries[$msgid]);
// You can also change translator comments, code comments, flags...
如果您不使用 composer,您可以按顺序包含文件或使用自动加载器加载这些文件。
require_once('Sepia/InterfaceHandler.php');
require_once('Sepia/StringHandler.php');
require_once('Sepia/FileHandler.php');
require_once('Sepia/PoParser.php');
使用file
、strpos
和substr
函数的解决方案:
假设输入文件 msgdata
包含以下内容:
msgid "question_fill_form"
msgstr ""
"Please fill the form"
"<br>All fields are mandatory"
msgid "offer_contact_error"
msgstr ""
"Error detected "
"please click \"<em>restart</em>\" on the right side."
连续处理:
$lines = file('msgdata');
$result = [];
foreach ($lines as $k => $line) {
if (strpos($line, 'msgid') === 0) {
$result[] = ['msgid' => substr($line, strpos($line, ' '))];
} elseif (strpos($line, 'msgstr') === 0) {
$result[count($result)-1]['msgstr'] = substr($line, strpos($line, ' '));
} else {
$result[count($result)-1]['msgstr'] .= $line;
}
}
print_r($result);
输出:
Array
(
[0] => Array
(
[msgid] => "question_fill_form"
[msgstr] => ""
"Please fill the form"
"
All fields are mandatory"
)
[1] => Array
(
[msgid] => "offer_contact_error"
[msgstr] => ""
"Error detected "
"please click \"restart\" on the right side."
)
)