【问题标题】:Replace part of a string depending on the string content根据字符串内容替换字符串的一部分
【发布时间】:2011-07-28 08:08:51
【问题描述】:

标记示例:

<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>

如何选择&lt;pre&gt;&lt;/pre&gt;&lt;code&gt;&lt;/code&gt; 之间的所有内容并在其上运行函数?通过这个函数,我需要传递 3 个参数:选择的字符串部分(&amp;lt;p&amp;gt; a paragraph &amp;lt;/p&amp;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>

【问题讨论】:

  • 这是一个包含根元素的完整 HTML 页面还是只有部分元素,如上图所示?
  • 不,它是部分 html 块,它基本上是包含代码示例的文章或评论...

标签: php html regex string


【解决方案1】:

我认为应该是这样的:

$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 是未定义的。但它应该让您对操作方法有一个很好的了解。

请注意,这不适用于嵌套元素,例如:

<pre lang="html">
  <p>some nested element</p>
  &lt;p&gt; a paragraph &lt;/p&gt;
</pre>

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

【讨论】:

  • 谢谢。我很抱歉这么愚蠢,但我如何获得处理后的字符串? :) $new_content 里面只有代码的东西
猜你喜欢
  • 2016-02-03
  • 2022-07-18
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
相关资源
最近更新 更多