PHP:用DOMText节点替换DOMElement

时间:2017-05-28 23:33:52

标签: php regex domdocument

我想创建一些自定义标签进行翻译,例如

<trad>SOMETHING</trad>

我还有一个带有$ GLOBALS变量的文件,例如:

$GLOBALS['SOMETHING'] = 'Some text';

$GLOBALS['SOMETHINGELSE'] = 'Some other text';

所以我已经能够以这种方式展示我的翻译:

$string = "<trad>SOMETHING</trad>";

$string = preg_replace('/<trad[^>]*?>([\\s\\S]*?)<\/trad>/','\\1', $string);
echo $GLOBALS[$string];

这很有效,但是当我有一些像下面代码那样复杂的东西时,或者当我有更多这个标签出现时,我无法让它工作:

$string = "Lorem ipsum <trad>SOMETHING</trad> <h1>Hello</h1> <trad>SOMETHINGELSE</trad>";

理想情况下,我想创建一个新的变量$ string,将我在我的标签中找到的值替换为能够用简单的回声显示它。

所以我想要这样的输出:

echo $string; //output: Lorem ipsum Some text <h1>Hello</h1> Some other text

你们能帮助我吗?

1 个答案:

答案 0 :(得分:2)

Regex不是治疗HTMLstring的有效方法。在这里,我们使用DOMDocument代替Regex来实现所需的输出。 strip_tags的最后一步已经完成以实现所需的输出,如果向loadHTML提供了有效的HTML字符串,则不需要saveHTML($node)来完成工作。< / p>

Try this code snippet here

<?php
ini_set('display_errors', 1);

libxml_use_internal_errors(true);

$array["SOMETHING"]="some text";
$array["SOMETHINGELSE"]="some text other";

$string = "Lorem ipsum <trad>SOMETHING</trad> <h1>Hello</h1> <trad>SOMETHINGELSE</trad>";

$domDocument = new DOMDocument();
$domDocument->loadHTML($string,LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD);

$results=$domDocument->getElementsByTagName("trad");
do
{
    foreach($results as $result)
    {
        $result->parentNode->replaceChild($domDocument->createTextNode($array[trim($result->nodeValue)]),$result);
    }
}
while($results->length>0);

echo strip_tags($domDocument->saveHTML(),"<h1>");