使用PHP替换XHTML标记并通过preg_replace添加参数


Using PHP to replace XHTML tags and add parameters via preg_replace

假设您有以下代码(具有唯一ID的<art></art>指定的这些部分是多个):

<art id="001">
<p class="prim"><h1>word1</h1>Text</p>
</art>
<art id="002">
<p class="prim"><h1>word2</h1>Text</p>
<p class="sec"><h1>word2.1</h1>Text</p>
</art>

然后我如何使用PHP,假设函数preg_replace来查找和替换由<art></art>分隔的每个唯一部分(让我们称之为文章)?输出如下所示:

<tra id="001" title="word1">
<index value="word1">
<p class="prim"><h1>word1</h1>Text</p>
</tra>
<tra id="002" title="word2">
<index value="word2" />
<p class="prim"><h1>word2</h1>Text</p>
<p class="sec"><h1>word2.1</h1>Text</p>
</tra>

目前,我正在努力使用正则表达式来处理换行,并将其限制为单独修改每篇文章。它所做的是,它采用第一个<art>和最后一个</art>,并用一篇文章的内容替换两者之间的所有内容。我使用的代码如下(一切都存储到变量$text;s修饰符包括换行符):

$text = preg_replace("#'<art id='"(.+)'"'>(.+)'<p class='"prim'"'>'<h1'>(.+?)'</h1'>#s", '<tra id="$1" title="$3"><index value="$3" /><p class="main"><h2>$3</h2>', $text);
$text = preg_replace("#'</art#", '</tra', $text);

我的目标的另一个基本解释是采取一切由<art></art>分隔单独,存储特定部分到局部变量,然后使用这些变量和额外的文本完全重建它。我可以用特定的行来做到这一点,但是我无法将存储例如word1的变量的内容传递给<art id="001" title="word1">

我花了几个小时寻找解决方案,但我似乎犯了一个基本的错误(正则表达式初学者)。

这是一个小小的起点。这可能不是最简单的方法,也不完全符合你的规范,但我希望它能给你一些开始编码的想法:

<?php
$fragment = '<art id="001">
<p class="prim"><h1>word1</h1>Text</p>
</art>
<art id="002">
<p class="prim"><h1>word2</h1>Text</p>
<p class="sec"><h1>word2.1</h1>Text</p>
</art>';
$dom = new DOMDocument;
libxml_use_internal_errors(TRUE);
$dom->loadHTML($fragment);
libxml_use_internal_errors(FALSE);
$articles = $dom->getElementsByTagName('art');
foreach($articles as $article){
    $titles = $article->getElementsByTagName('h1');
    if($titles->length>0){
        $title = $titles->item(0)->nodeValue;
        $index = $dom->createElement('index');
        $index->setAttribute('value', $title);
        $article->appendChild($index);
    }
}
$dom->formatOutput = TRUE;
$dom->preserveWhiteSpace = TRUE;
echo $dom->saveHTML();

…将打印这个:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<art id="001"><p class="prim"></p>
<h1>word1</h1>Text
<index value="word1"></index></art><art id="002"><p class="prim"></p>
<h1>word2</h1>Text
<p class="sec"></p>
<h1>word2.1</h1>Text
<index value="word2"></index></art>
</body></html>