假设您有以下代码(具有唯一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>