使用preg_replace_callback输出HTML不按顺序排列

时间:2016-05-26 00:14:38

标签: php preg-replace-callback

我有一个从函数返回的HTML:

<fieldset>
    <legend>Title</legend>
    <div>
        <label>
            <i>String that gets translated</i>
        </label>
        <textarea>
            <i>Another string</i>
        </textarea>
    </div>
</fieldset>

然后我使用preg_replace_callback获取<i>标记之间的字符串,并将其替换为翻译后的字符串,如下所示:

$translation = preg_replace_callback("/\<i\>(.+?)\<\/i\>/", 'translator', $html);

function translator($matches) {
    return __t($matches[1]);
}

然而,当我输出html - echo $translation;时 - 我得到以下内容:

String that gets translated Another string<--this is not inside <i> tags
<fieldset>
    <legend>Title</legend>
    <div>
        <label>
            <i></i> <--the string should be placed here
        </label>
        <textarea>
            <i></i> <--and here
        </textarea>
    </div>
</fieldset>

这个问题一直困扰着我的脑袋,我无法找到解决问题的方法。如何以正确的顺序输出html和翻译的字符串?我是否必须使用DOMDocument::loadHTML,如果是,请如何使用?

1 个答案:

答案 0 :(得分:2)

使用输出缓冲功能。

ob_flush(); // flush any pending output buffer
ob_start();
$translation = preg_replace_callback("/\<i\>(.+?)\<\/i\>/", 'translator', $html);
ob_end_clean();

function translator($matches) {
    __t($matches[1]);
    return ob_get_clean();
}