从php处理HTML

esa*_*wan 5 html php dom html-manipulation

我有一个html文件,index.php我想将该文件<div>的类main中的内容与其他文本替换.我怎样才能实现这一目标?

html中的示例内容:

<div class="main">
Replace this text with some code!
</div>
Run Code Online (Sandbox Code Playgroud)

我希望使用php获取此div中的内容并将其替换为其他内容.但我不知道如何做到这一点.

更新: 我知道使用javascript的客户端技巧.我想做这个服务器端.该文件将是HTML而不是PHP.所以我想我必须在PHP中打开html并执行此操作,但我并不确切如何.

可以使用xpath或html dom解析器或其他东西吗?谷歌搜索给了我这些条款,但我不知道他们实际是什么.

Wes*_*n C 15

您可以使用PHP的DOM类/函数来执行此操作.

首先创建/加载您的文档:

$d = new DOMDocument();
$d->loadHTML($yourWellFormedHTMLString);
Run Code Online (Sandbox Code Playgroud)

然后,您将要找到要更改的文档节点.您可以使用XPath执行此操作:

$xpathsearch = new DOMXPath($d);
$nodes = $xpathsearch->query('//div[contains(@class,'main')]');  
Run Code Online (Sandbox Code Playgroud)

然后,您将要遍历匹配的节点,并在其中创建新节点:

foreach($nodes as $node) {
    $newnode = $d->createDocumentFragment();
    $newnode->appendXML($yourCodeYouWantToFillIn);
    $node->appendChild($newnode);
}
Run Code Online (Sandbox Code Playgroud)

如果您不介意在开发的早期阶段搞乱使用库,请查看CAST(内容寻址样式模板).它几乎被设计用于执行您正在描述的内容,如果没有其他内容,您可以在源代码内查看示例.

(注意:我确信精明的人会注意到它//div[contains(@class,'main')]并不完全等同于CSS选择器div.main......因为class属性可以包含多个类.这样做确实很难实现我觉得最好先从简化表达式,当你向人们介绍它时,即使它最适合那些走这条路线的人最终能够很好地了解xpath以正确处理这个问题.或者,只需使用id而不是类.:)

  • `loadHtml`(与`loadXml`不同)不需要`$ yourWellFormedHTMLString`.它可以解析现实世界中破碎的HTML. (3认同)
  • 就像这个解决方案的注意事项一样,如果有人偶然发现它:正如@ weston-c所提到的那样,查询不会只返回那些具有类"main"的元素,而是返回其类名包含"main"的所有元素.所以class ="maintain"也会被退回.相反,如果你使用// div [contains(concat('',normalize-space(@class),''),'$ classname')],你可以使查询更精确.它也比答案链接中提供的解决方案更容易......希望这会有所帮助. (2认同)