使用str_replace将DIV转换为SPAN


convert DIV to SPAN using str_replace

我有一些数据作为$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),这并不完美,但在这种情况下有效。您可能需要改进此部分。