Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:用DOMText节点替换DOMELENT_Php_Regex_Domdocument - Fatal编程技术网

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>");