我有一些数据作为$data提供给我,其中一些数据的示例是…
<div class="widget_output">
<div id="test1">
Some Content
</div>
<ul>
<li>
<p>
<div>768hh</div>
<div>2308d</div>
<div>237ds</div>
<div>23ljk</div>
</p>
</li>
<div id="temp3">
Some more content
</div>
<li>
<p>
<div>lkgh322</div>
<div>32khhg</div>
<div>987dhgk</div>
<div>23lkjh</div>
</p>
</li>
</div>
我正试图更改段落中无效的HTML DIV,所以我最终改为。。。
<div class="widget_output">
<div id="test1">
Some Content
</div>
<ul>
<li>
<p>
<span>768hh</span>
<span>2308d</span>
<span>237ds</span>
<span>23ljk</span>
</p>
</li>
<div id="temp3">
Some more content
</div>
<li>
<p>
<span>lkgh322</span>
<span>32khhg</span>
<span>987dhgk</span>
<span>23lkjh</span>
</p>
</li>
</div>
我正在尝试使用str_replace和类似的东西来完成此操作。。。
$data = str_replace('<div>', '<span>', $data);
$data = str_replace('</div>', '</span', $data);
有没有一种方法可以将这两个语句结合起来,并使其只影响"这是一个随机项目"而不影响其他事件?
$data = str_replace(array('<div>', '</div>'), array('<span>', '</span>'), $data);
只要你没有提供任何其他细节,只问:
有没有一种方法可以将这两个语句结合起来,并使其只影响"这是一个随机项目"而不影响其他事件?
给你:
$data = str_replace('<div>This is a random item</div>', '<span>This is a random item</span>', $data);
您需要使用正则表达式来执行您想要执行的操作,或者实际将字符串解析为XML并以这种方式进行修改。XML解析几乎可以肯定是"最安全的",因为只要字符串是有效的XML,它就会以可预测的方式工作。正则表达式有时会受到字符串格式不完全正确的影响,但如果你的输入足够可预测,它们也可以
$parsed_string = preg_replace("~<div>(?=This is a random item)(.*?)</div>~", "<span>$1</span>, $input_string);
这里发生的事情是regex正在寻找一个<div>
标记,后面跟着(使用前瞻断言)This is a random item
。然后,它捕获该标签和下一个</div>
标签之间的任何文本。最后,它将匹配替换为<span>
,然后是来自div
标签内部的捕获文本,然后是</span>
。这在您发布的示例中可以很好地工作,但如果<div>
标记具有class属性,则会出现问题。如果您期望这样的结果,那么可能需要更复杂的正则表达式,或者完整的XML解析可能是最好的方法。
我对其他答案有点惊讶,我以为有人会发布一个好的答案,但这并没有发生。在这种情况下,str_replace
的功能不够强大,而且正则表达式是偶然的,您需要编写一个解析器。
你不必编写一个完整的HTML解析器,你可以作弊。
$in = '<div class="widget_output">
(..)
</div>';
$lines = explode("'n", $in);
$in_paragraph = false;
foreach ($lines as $nr => $line) {
if (strstr($line, "<p>")) {
$in_paragraph = true;
} else if (strstr($line, "</p>")) {
$in_paragraph = false;
} else {
if ($in_paragraph) {
$lines[$nr] = str_replace(array('<div>', '</div>'), array('<span>', '</span>'), $line);
}
}
}
echo implode("'n", $lines);
这里的关键部分是检测你是否在一个段落中。只有当你在一个段落中时,才进行字符串替换。
注意:我正在换行('n
),这并不完美,但在这种情况下有效。您可能需要改进此部分。