Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.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 获取HTML标记之间的文本&;替换它们_Php_Regex_Domdocument - Fatal编程技术网

Php 获取HTML标记之间的文本&;替换它们

Php 获取HTML标记之间的文本&;替换它们,php,regex,domdocument,Php,Regex,Domdocument,我想在HTML标记之间获取文本并动态替换它们。考虑到HTML标记可能包含任何内容(嵌套的HTML标记、注释等),我认为类是最好的选择。然而,我找不到任何符合我需要的例子。我只能获取特定选定html标记之间的文本。我也找不到替换所选文本的示例 <?php // HTML OUTPUT $html= "<p>Subject,</p> <h1>H1 title</h1> <h2>H2 title</h2> <h3&g

我想在HTML标记之间获取文本并动态替换它们。考虑到HTML标记可能包含任何内容(嵌套的HTML标记、注释等),我认为类是最好的选择。然而,我找不到任何符合我需要的例子。我只能获取特定选定html标记之间的文本。我也找不到替换所选文本的示例

<?php 
// HTML OUTPUT
$html= "<p>Subject,</p>
<h1>H1 title</h1>
<h2>H2 title</h2>
<h3>H2 title</h3>";

// DESIRED OUTPUT
$newHTML "<p>My Fav. Colors;</p>
<h1>Blue</h1>
<h2>Orange</h2>
<h3>Yellow</h3>";
?>

基本上,我希望动态地从HTML输出中获取文本(可能包含嵌套的HTML标记、注释、javascripts等等),并替换它们(替换的值将从数据库中选择)以创建新的HTML输出

最好的优雅方式是什么?类是我需要的工具,还是正则表达式是我需要的工具

如果您能给我看一小段代码,让我清楚地理解它,我将非常高兴


p.S.HTML文档可能是另一个域中的页面。例如。

下面是一个DOM示例

$html= "<p>Subject,</p>
<h1>H1 title</h1>
<h2>H2 title</h2>
<h3>H2 title</h3>";

$doc = new DOMDocument;
$doc->loadHTML( '<div>' . $html . '</div>');

foreach($doc->getElementsByTagName('div')->item(0)->childNodes as $node) {
    switch ($node->nodeName) {
        case "p":
            $node->nodeValue = "My Fav. Colors";
            break;
        case "h1":
            $node->nodeValue = "Blue";
            break;
        case "h2":
            $node->nodeValue = "Orange";
            break;
        case "h3":
            $node->nodeValue = "Yellow";
            break;          
    }
}
echo $doc->saveXML($doc);
$html=“主题

H1标题 H2标题 H2标题”; $doc=新文档; $doc->loadHTML('.$html''); foreach($doc->getElementsByTagName('div')->item(0)->childNodes作为$node){ 开关($node->nodeName){ 案例“p”: $node->nodeValue=“我最喜欢的颜色”; 打破 案例“h1”: $node->nodeValue=“蓝色”; 打破 案例“h2”: $node->nodeValue=“橙色”; 打破 案例“h3”: $node->nodeValue=“黄色”; 打破 } } echo$doc->saveXML($doc);
我认为最好使用Dom解析器而不是常规表达式正则表达式可以帮助您在不理解正在处理的文档的情况下替换简单字符串。DOM文档和类似文档理解HTML(并且要求它是有效的)。根据复杂性(如您所说的注释),DOM文档似乎是一条可行之路。但是,如果您知道第一个标签中没有第二个标签,那么您可以拆分它们并对其进行正则化(这取决于您如何确定要替换的内容。感谢各位的评论。考虑到HTML可能包含任何正则表达式可能会导致一些错误的内容。DOM文档似乎是最好的方法,但如何在HTML标记之间获取文本并替换它们?@Revenant如果您的文本将以特定形式出现-例如,您有类似于
%subject%的内容。)
-您可以将其替换为
str\u
。但我不确定是否是这种情况,因为不清楚您是否正在生成初始文档。@arxanas;首先感谢您的评论。有问题的HTML文档可能是另一个域上的页面。例如。谢谢您的回答Teno。不幸的是,我不知道我是否会重放它e
p
标记可能会喜欢文本颜色。这取决于其中的文本,而不是标记。不过这可能是一个方便的例子。我将检查它。在这种情况下,只需检查nodeValue而不是nodeName,如
if($node->nodeValue=='matching text'))
我刚刚仔细检查了它。它工作正常,除了一些嵌套元素,如
  • 文本1
  • 文本2
    • 一旦我得到输出,它就更改了文本,但没有更多的
    • 元素。输出是
        更改了1更改了2
      。然而,Div
中的
文本1与我的工作方式一样输出是Div中的
Changed Text 1
如何处理
元素?非常感谢您的帮助。对于
  • 标记,您可以执行,
    foreach($doc->getElementsByTagName('li')as$node){…在这里执行一些操作…}
    如果您知道要处理哪些标记,您可以始终使用getElementsByTagName('tagname'))。如果您需要遍历所有元素,而不知道哪些标记有一些需要更改的信息,那么这将有点复杂。请查看此页面。