根据字符串内容替换字符串的一部分

时间:2011-04-02 17:35:00

标签: php html regex string

标记示例:

<p> a paragraph </p>
<pre lang="html">
  &lt;p&gt; a paragraph &lt;/p&gt;
</pre>
<code lang="html">
  &lt;p&gt; a paragraph &lt;/p&gt;
</code>

如何在<pre></pre><code></code>之间选择所有内容并在其上运行功能?通过这个函数,我需要传递3个参数:所选字符串的一部分(&lt;p&gt; a paragraph &lt;/p&gt;),容器类型(precode),以及容器的参数(如lang="html")。

该函数应根据其他2个参数更改字符串的选定部分(如果相关,我想在其上运行GeShi荧光笔),然后用它替换原始字符串的内容,包括容器。类似的东西:

<p> a paragraph </p>
<div class="html pre">
  &lt;p&gt; a paragraph &lt;/p&gt;
</div>
<div class="html code">
  &lt;p&gt; a paragraph &lt;/p&gt;
</div>

1 个答案:

答案 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>
  &lt;p&gt; a paragraph &lt;/p&gt;
</pre>

如果您想处理嵌套元素,请使用a function to get the innerHTML而不是$element->textContent