PHP:用DOMText节点替换DOMELENT
例如,我想创建一些用于翻译的自定义标记PHP:用DOMText节点替换DOMELENT,php,regex,domdocument,Php,Regex,Domdocument,例如,我想创建一些用于翻译的自定义标记 某物 我还有一个带有$GLOBALS变量的文件,比如: $GLOBALS['SOMETHING'] = 'Some text'; $GLOBALS['SOMETHINGELSE']='someothertext' 因此,我能够以这种方式展示我的翻译: $string = "<trad>SOMETHING</trad>"; $string = preg_replace('/<trad[^>]*?>([\\s\\S
某物
我还有一个带有$GLOBALS变量的文件,比如:
$GLOBALS['SOMETHING'] = 'Some text';
$GLOBALS['SOMETHINGELSE']='someothertext'代码>
因此,我能够以这种方式展示我的翻译:
$string = "<trad>SOMETHING</trad>";
$string = preg_replace('/<trad[^>]*?>([\\s\\S]*?)<\/trad>/','\\1', $string);
echo $GLOBALS[$string];
$string=“某物”;
$string=preg_replace('/]*?>([\\s\\s]*?)/','\\1',$string);
echo$GLOBALS[$string];
这是完美的,但是当我有一些更复杂的东西,比如下面的代码,或者当我有更多的标签出现时,我不能让它工作:
$string=“Lorem ipsum SOMETHING Hello SOMETHINGELSE”代码>
理想情况下,我希望创建一个新的变量$string,替换我在标记中找到的值,并能够用一个简单的回显来显示它
因此,我希望输出如下:
echo$string;
//输出:Lorem ipsum一些文本你好一些其他文本
你们能帮帮我吗?Regex
不是治疗HTMLstring
的有效方法。这里我们使用DOMDocument
而不是Regex
来实现所需的输出。strip_tags
的最后一步已经完成,以实现所需的输出,如果向loadHTML
提供了有效的HTML字符串,则不需要执行此操作,在这种情况下,saveHTML($node)
将执行此操作
loadHTML($string,LIBXML\u HTML\u noimpled | LIBXML\u HTML\u NODEFDTD);
$results=$domDocument->getElementsByTagName(“trad”);
做
{
foreach($results作为$result)
{
$result->parentNode->replaceChild($domDocument->createTextNode($array[trim($result->nodeValue)]),$result);
}
}
而($results->length>0);
echo strip_标记($domDocument->saveHTML(),“”);
您需要使用DOMDocument
类及其方法(查找教程/阅读PHP手册)。正则表达式不是这样做的正确方法。(您有一个结构化字符串=使用该结构),但这样我就必须用最后一条指令预测可以插入的所有标记?像h1、h2、h3、a、img等?@Ame没有问题,不要依赖strip_标记($domDocument->saveHTML(),“”)
但只要确保如果不应用此选项,那么输出就会被p
标记包围,您可以对该标记进行修剪,以防您没有提供有效的HTML,否则它可以正常工作,您可以检查it@Ame您将得到如下输出Lorem ipsum一些文本你好一些其他文本,您可以对其进行修剪。好的,谢谢。阵列方法是唯一可用的方法吗?我不能使用GLOBALS变量,对吗?我这么说是因为我试图用$GLOBALS替换$array,但它似乎不起作用。。。如果很容易解决,你能帮我吗?我将非常感激:)
<?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>");