Php 如何替换html标记中的值?

Php 如何替换html标记中的值?,php,html,regex,dom,preg-replace,Php,Html,Regex,Dom,Preg Replace,我想用$tagsReplace数组中定义的内容替换元素内容,但我当前的ode preg_replace有问题: $tagsReplace = array( 'header' => 'header', 'tag1' => 'this is tag1', 'tag2' => 'this is tag2', 'tag3' => 'this is tag3', 'footer' => 'footer', ); $content =

我想用$tagsReplace数组中定义的内容替换元素内容,但我当前的ode preg_replace有问题:

$tagsReplace = array(
    'header' => 'header',
    'tag1' => 'this is tag1',
    'tag2' => 'this is tag2',
    'tag3' => 'this is tag3',
    'footer' => 'footer',
); 

$content = '
<!DOCTYPE html>
<hthml>
<header data-edit="true" data-tag-id="header"></header>
<div data-edit="true" data-tag-id="tag1"></div>
<div data-edit="true" data-tag-id="tag2"></div>
<div data-edit="true" data-tag-id="tag3"></div>
<footer data-edit="true" data-tag-id="footer"></footer>
</html>
';

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($content);
$xpath = new DomXpath($dom);

foreach ($xpath->query('//*[@data-edit="true"]') as $rowNode) { 
    $tagID = $rowNode->getAttribute('data-tag-id');
    $content = preg_replace('/(<div.*?data-edit="true"[^>]*>)(.*?)(<\/div>)/i', '$1'. $tagsReplace[$tagID] . '$3', $content);
}
echo $content;
$tagsReplace=array(
“头”=>“头”,
'tag1'=>'这是tag1',
'tag2'=>'这是tag2',
'tag3'=>'这是tag3',
'页脚'=>'页脚',
); 
$content='1
';
$dom=新的DOMDocument();
libxml\u使用\u内部错误(true);
$dom->loadHTML($content);
$xpath=newdomxpath($dom);
foreach($xpath->query('/*[@data edit=“true”]”)作为$rowNode){
$tagID=$rowNode->getAttribute('data-tag-id');
$content=preg_replace('/(]*>)(.*?)/i','$1'.$tagsReplace[$tagID].$3',$content);
}
echo$内容;
我想要的是得到这样的输出:

<!DOCTYPE html>
<hthml>
<header data-edit="true" data-tag-id="header">header</header>
<div data-edit="true" data-tag-id="tag1">this is tag1</div>
<div data-edit="true" data-tag-id="tag2">this is tag2</div>
<div data-edit="true" data-tag-id="tag3">this is tag3</div>
<footer data-edit="true" data-tag-id="footer">footer</footer>
</html>

标题
这是tag1
这是tag2
这是tag3
页脚
电流输出为:

 <!DOCTYPE html>
<hthml>
<header data-edit="true" data-tag-id="header"></header>
<div data-edit="true" data-tag-id="tag1">footer</div>
<div data-edit="true" data-tag-id="tag2">footer</div>
<div data-edit="true" data-tag-id="tag3">footer</div>
<footer data-edit="true" data-tag-id="footer"></footer>
</html>

页脚
页脚
页脚

因此,所有包含atribute data edit=“true”和数据标签id的元素必须将其中的内容替换为在arra$tagsReplace中定义的tagid值。

您不能总是替换为同一用户,因为您有3个不同的标签

看看这段代码:

<?php

$tagsReplace = array(
    'header' => 'header',
    'tag1' => 'this is tag1',
    'tag2' => 'this is tag2',
    'tag3' => 'this is tag3',
    'footer' => 'footer',
); 

$content = '
<!DOCTYPE html>
<html>
<header data-edit="true" data-tag-id="header"></header>
<div data-edit="true" data-tag-id="tag1"></div>
<div data-edit="true" data-tag-id="tag2"></div>
<div data-edit="true" data-tag-id="tag3"></div>
<footer data-edit="true" data-tag-id="footer"></footer>
</html>
';

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($content);
$xpath = new DomXpath($dom);

$html = explode("\n", trim($content));
$i = 2;

foreach ($xpath->query('//*[@data-edit="true"]') as $rowNode) { 
    $tagID = $rowNode->getAttribute('data-tag-id');

    switch ($rowNode->nodeName) {
        case 'header':
        $html[$i] = preg_replace('/(<header.*?data-edit="true"[^>]*>)(.*?)(<\/header>)/i', '$1'. $tagsReplace[$tagID] . '$3', $html[$i]);
        break;

        case 'div':
        $html[$i] = preg_replace('/(<div.*?data-edit="true"[^>]*>)(.*?)(<\/div>)/i', '$1'. $tagsReplace[$tagID] . '$3', $html[$i]);
        break;  

        case 'footer':
        $html[$i] = preg_replace('/(<footer.*?data-edit="true"[^>]*>)(.*?)(<\/footer>)/i', '$1'. $tagsReplace[$tagID] . '$3', $html[$i]);
        break;  
    }   
    $i++;
}

$content = implode("\n", $html);

echo $content;

?>

您不能总是用同一个用户替换,因为您有3个不同的标签

看看这段代码:

<?php

$tagsReplace = array(
    'header' => 'header',
    'tag1' => 'this is tag1',
    'tag2' => 'this is tag2',
    'tag3' => 'this is tag3',
    'footer' => 'footer',
); 

$content = '
<!DOCTYPE html>
<html>
<header data-edit="true" data-tag-id="header"></header>
<div data-edit="true" data-tag-id="tag1"></div>
<div data-edit="true" data-tag-id="tag2"></div>
<div data-edit="true" data-tag-id="tag3"></div>
<footer data-edit="true" data-tag-id="footer"></footer>
</html>
';

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($content);
$xpath = new DomXpath($dom);

$html = explode("\n", trim($content));
$i = 2;

foreach ($xpath->query('//*[@data-edit="true"]') as $rowNode) { 
    $tagID = $rowNode->getAttribute('data-tag-id');

    switch ($rowNode->nodeName) {
        case 'header':
        $html[$i] = preg_replace('/(<header.*?data-edit="true"[^>]*>)(.*?)(<\/header>)/i', '$1'. $tagsReplace[$tagID] . '$3', $html[$i]);
        break;

        case 'div':
        $html[$i] = preg_replace('/(<div.*?data-edit="true"[^>]*>)(.*?)(<\/div>)/i', '$1'. $tagsReplace[$tagID] . '$3', $html[$i]);
        break;  

        case 'footer':
        $html[$i] = preg_replace('/(<footer.*?data-edit="true"[^>]*>)(.*?)(<\/footer>)/i', '$1'. $tagsReplace[$tagID] . '$3', $html[$i]);
        break;  
    }   
    $i++;
}

$content = implode("\n", $html);

echo $content;

?>

要获得所需的结果,可以在替换数组中循环,并在同一XPath查询中搜索
数据编辑=true
数据标记id=
,然后替换节点值。这样,您根本不必使用
preg\u replace

$content = '
<!DOCTYPE html>
<html>
<header data-edit="true" data-tag-id="header"></header>
<div data-edit="true" data-tag-id="tag1"></div>
<div data-edit="true" data-tag-id="tag2"></div>
<div data-edit="true" data-tag-id="tag3"></div>
<footer data-edit="true" data-tag-id="footer"></footer>
</html>
';

$tagsReplace = array(
    'header' => 'header',
    'tag1'   => 'this is tag1',
    'tag2'   => 'this is tag2',
    'tag3'   => 'this is tag3',
    'footer' => 'footer',
);

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($content);
$xpath = new DomXpath($dom);

foreach ($tagsReplace as $key => $value) {
    $nodes = $xpath->query(
        '//*[@data-edit="true" and @data-tag-id="' . $key . '"]'
    );

    if ($nodes->length) {
        $nodes->item(0)->nodeValue = $value;
    }
}

$dom->formatOutput = true;
echo $dom->saveHTML();
$content='1!'
';
$tagsReplace=数组(
“头”=>“头”,
'tag1'=>'这是tag1',
'tag2'=>'这是tag2',
'tag3'=>'这是tag3',
'页脚'=>'页脚',
);
$dom=新的DOMDocument();
libxml\u使用\u内部错误(true);
$dom->loadHTML($content);
$xpath=newdomxpath($dom);
foreach($tags替换为$key=>$value){
$nodes=$xpath->query(
'//*[@data edit=“true”和@data tag id=“”.$key.”
);
如果($nodes->length){
$nodes->item(0)->nodeValue=$value;
}
}
$dom->formatOutput=true;
echo$dom->saveHTML();
输出:

<!DOCTYPE html>
<html><body>
<header data-edit="true" data-tag-id="header">header</header>
<div data-edit="true" data-tag-id="tag1">this is tag1</div>
<div data-edit="true" data-tag-id="tag2">this is tag2</div>
<div data-edit="true" data-tag-id="tag3">this is tag3</div>
<footer data-edit="true" data-tag-id="footer">footer</footer>
</body></html>

标题
这是tag1
这是tag2
这是tag3
页脚

要获得所需的结果,可以在替换数组中循环,并在同一XPath查询中搜索
数据编辑=true
数据标记id=
,然后替换节点值。这样,您根本不必使用
preg\u replace

$content = '
<!DOCTYPE html>
<html>
<header data-edit="true" data-tag-id="header"></header>
<div data-edit="true" data-tag-id="tag1"></div>
<div data-edit="true" data-tag-id="tag2"></div>
<div data-edit="true" data-tag-id="tag3"></div>
<footer data-edit="true" data-tag-id="footer"></footer>
</html>
';

$tagsReplace = array(
    'header' => 'header',
    'tag1'   => 'this is tag1',
    'tag2'   => 'this is tag2',
    'tag3'   => 'this is tag3',
    'footer' => 'footer',
);

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($content);
$xpath = new DomXpath($dom);

foreach ($tagsReplace as $key => $value) {
    $nodes = $xpath->query(
        '//*[@data-edit="true" and @data-tag-id="' . $key . '"]'
    );

    if ($nodes->length) {
        $nodes->item(0)->nodeValue = $value;
    }
}

$dom->formatOutput = true;
echo $dom->saveHTML();
$content='1!'
';
$tagsReplace=数组(
“头”=>“头”,
'tag1'=>'这是tag1',
'tag2'=>'这是tag2',
'tag3'=>'这是tag3',
'页脚'=>'页脚',
);
$dom=新的DOMDocument();
libxml\u使用\u内部错误(true);
$dom->loadHTML($content);
$xpath=newdomxpath($dom);
foreach($tags替换为$key=>$value){
$nodes=$xpath->query(
'//*[@data edit=“true”和@data tag id=“”.$key.”
);
如果($nodes->length){
$nodes->item(0)->nodeValue=$value;
}
}
$dom->formatOutput=true;
echo$dom->saveHTML();
输出:

<!DOCTYPE html>
<html><body>
<header data-edit="true" data-tag-id="header">header</header>
<div data-edit="true" data-tag-id="tag1">this is tag1</div>
<div data-edit="true" data-tag-id="tag2">this is tag2</div>
<div data-edit="true" data-tag-id="tag3">this is tag3</div>
<footer data-edit="true" data-tag-id="footer">footer</footer>
</body></html>

标题
这是tag1
这是tag2
这是tag3
页脚

试试这个,它接受任何类型的标签

$tagsReplace = array(
    'header' => 'header',
    'tag1' => 'this is tag1',
    'tag2' => 'this is tag2',
    'tag3' => 'this is tag3',
    'footer' => 'footer',
); 

$content = '
<!DOCTYPE html>
<html>
<header data-edit="true" data-tag-id="header"></header>
<div data-edit="true" data-tag-id="tag1"></div>
<div data-edit="true" data-tag-id="tag2"></div>
<div data-edit="true" data-tag-id="tag3"></div>
<footer data-edit="true" data-tag-id="footer"></footer>
</html>
';

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($content);
$xpath = new DomXpath($dom);

foreach ($xpath->query('//*[@data-edit="true"]') as $rowNode) {
    $tagID = $rowNode->getAttribute('data-tag-id');
    $content = preg_replace('/(<(.*?) [^>]*?data-tag-id="'.$tagID.'"[^>]*>)(.*?)(<\/\2>)/i', '$1'. $tagsReplace[$tagID] . '$4', $content);
}
echo $content;
$tagsReplace=array(
“头”=>“头”,
'tag1'=>'这是tag1',
'tag2'=>'这是tag2',
'tag3'=>'这是tag3',
'页脚'=>'页脚',
); 
$content='1
';
$dom=新的DOMDocument();
libxml\u使用\u内部错误(true);
$dom->loadHTML($content);
$xpath=newdomxpath($dom);
foreach($xpath->query('/*[@data edit=“true”]”)作为$rowNode){
$tagID=$rowNode->getAttribute('data-tag-id');
$content=preg_replace('/(]*?数据标记id=“'.$tagID.”“[^>]*>)(.*?)((?)(/i','$1'.$tagsReplace[$tagID]。$4',$content);
}
echo$内容;

试试这个,它接受任何类型的标签

$tagsReplace = array(
    'header' => 'header',
    'tag1' => 'this is tag1',
    'tag2' => 'this is tag2',
    'tag3' => 'this is tag3',
    'footer' => 'footer',
); 

$content = '
<!DOCTYPE html>
<html>
<header data-edit="true" data-tag-id="header"></header>
<div data-edit="true" data-tag-id="tag1"></div>
<div data-edit="true" data-tag-id="tag2"></div>
<div data-edit="true" data-tag-id="tag3"></div>
<footer data-edit="true" data-tag-id="footer"></footer>
</html>
';

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($content);
$xpath = new DomXpath($dom);

foreach ($xpath->query('//*[@data-edit="true"]') as $rowNode) {
    $tagID = $rowNode->getAttribute('data-tag-id');
    $content = preg_replace('/(<(.*?) [^>]*?data-tag-id="'.$tagID.'"[^>]*>)(.*?)(<\/\2>)/i', '$1'. $tagsReplace[$tagID] . '$4', $content);
}
echo $content;
$tagsReplace=array(
“头”=>“头”,
'tag1'=>'这是tag1',
'tag2'=>'这是tag2',
'tag3'=>'这是tag3',
'页脚'=>'页脚',
); 
$content='1
';
$dom=新的DOMDocument();
libxml\u使用\u内部错误(true);
$dom->loadHTML($content);
$xpath=newdomxpath($dom);
foreach($xpath->query('/*[@data edit=“true”]”)作为$rowNode){
$tagID=$rowNode->getAttribute('data-tag-id');
$content=preg_replace('/(]*?数据标记id=“'.$tagID.”“[^>]*>)(.*?)((?)(/i','$1'.$tagsReplace[$tagID]。$4',$content);
}
echo$内容;

因为您正在指定 div在您的赛前模式中 我们知道第一个元素以头开始,因此它不会匹配 因此,只需将preg_匹配模式开头的“div”替换为(.*?,即可匹配页眉甚至其他单词。 这:

$content=preg_replace(“/(]>)(.*?)(/i',“$1”。$tagsReplace[$tagID]。$3',$content)

变成:

$content=preg_replace(“/(]>)(.?)()/i',“$1”。$tagsReplace[$tagID]。$3',$content)

另一个选项是可用的,您可以使用preg\u replace\u回调(模式、函数、主题)神奇地做您想做的事情,这里有一个对我有用的解决方案:

$content = '
<!DOCTYPE html>
<hthml>
<header data-edit="true" data-tag-id="header"></header>
<div data-edit="true" data-tag-id="tag1"></div>
<div data-edit="true" data-tag-id="tag2"></div>
<div data-edit="true" data-tag-id="tag3"></div>
<footer data-edit="true" data-tag-id="footer"></footer>
</html>
';

$pattern = '/<(.+) data-edit="true" data-tag-id="(.*)"(.*?)>(.*?)<\/(.+)>/';
$another = preg_replace_callback($pattern, function($matches){
    $tagsReplace = array(
        'header' => 'header1',
        'tag1' => 'this is tag1',
        'tag2' => 'this is tag2',
        'tag3' => 'this is tag3',
        'footer' => 'footer',
    ); 
    return '<'.$matches[1].' data-edit="true" data-tag-id="'.$matches[2].'"'.$matches[3].'>'.$tagsReplace[$matches[2]].'<\/'.$matches[5].'>/';
}, $content);
# before the replacement 
print_r($content);
echo '\n';
// another holds the content after replacement 
print_r($another);
$content='1!'
';
$pattern='/(.*?)/';
$other=preg\u replace\u回调($pattern,function($matches){
$tagsReplace=数组(
'header'=>'header1',
'tag1'=>'这是tag1',
'tag2'=>'这是tag2',
'tag3'=>'这是tag3',
'页脚'=>'页脚',
); 
返回“”。$tagsReplace[$matches[2]]./;
}(单位:$content);
#更换前
打印(内容);
回音'\n';
//另一个保存替换后的内容
打印(另一个);

因为您正在指定 div在您的赛前模式中 我们知道第一个元素以头开始,因此它不会匹配 因此,只需将preg_匹配模式开头的“div”替换为(.*),即可匹配页眉甚至ot