如何在 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');

使用filestrpossubstr函数的解决方案:

假设输入文件 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."
        )
)