标记示例:
<p> a paragraph </p>
<pre lang="html">
<p> a paragraph </p>
</pre>
<code lang="html">
<p> a paragraph </p>
</code>
如何在<pre>
,</pre>
,<code>
,</code>
之间选择所有内容并在其上运行功能?通过这个函数,我需要传递3个参数:所选字符串的一部分(<p> a paragraph </p>
),容器类型(pre
或code
),以及容器的参数(如lang="html"
)。
该函数应根据其他2个参数更改字符串的选定部分(如果相关,我想在其上运行GeShi荧光笔),然后用它替换原始字符串的内容,包括容器。类似的东西:
<p> a paragraph </p>
<div class="html pre">
<p> a paragraph </p>
</div>
<div class="html code">
<p> a paragraph </p>
</div>
答案 0 :(得分:3)
我认为它应该是这样的:
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$elements = $xpath->query('//pre | //code');
在某些情况下(例如:如果使用getElementsByTagName而不是XPath),则需要对数组进行操作以获得正确的行为(请参阅this question),因此需要将节点复制到数组中。我会为这个例子做这件事:
$array = array();
foreach ($elements as $element) {
$array[] = $element;
}
foreach ($array as $element) {
$tag = $element->tagName;
$content = $element->textContent;
$lang = $element->getAttribute('lang');
$new_content = my_function($tag, $content, $lang);
$new_element = $dom->createElement('div');
$new_element->setAttribute('class', "$tag $lang");
$new_element->nodeValue = $new_content;
$element->parentNode->replaceChild($new_element, $element);
}
当然,在上面的示例中,my_function
未定义。但它应该给你一个关于howto的好主意。
请注意,这不适用于嵌套元素,如:
<pre lang="html">
<p>some nested element</p>
<p> a paragraph </p>
</pre>
如果您想处理嵌套元素,请使用a function to get the innerHTML而不是$element->textContent
。