Php 使用str_replace将DIV转换为SPAN

Php 使用str_replace将DIV转换为SPAN,php,str-replace,Php,Str Replace,我有一些数据是作为$data提供给我的,一些数据的一个例子是 <div class="widget_output"> <div id="test1"> Some Content </div> <ul> <li> <p> <div>768hh</div> <div>2308

我有一些数据是作为$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>

一些内容
  • 768小时 2308d 237ds 23ljk

  • 更多内容
  • lkgh322 32khhg 987dhgk 23lkjh

我正在尝试更改段落中无效的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>

一些内容
  • 768小时 2308d 237ds 23ljk

  • 更多内容
  • lkgh322 32khhg 987dhgk 23lkjh

我正在尝试使用str_替换为类似于

$data = str_replace('<div>', '<span>', $data);
$data = str_replace('</div>', '</span', $data);
$data=str_replace(“”,,$data);
$data=str_replace(“”,
$data=str_replace(数组(“”,)、数组(“”,)、$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);
$data=str_replace('这是一个随机项','这是一个随机项',$data);
$data=str_替换(数组('','')、数组('','')、$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);
$data=str_replace('这是一个随机项','这是一个随机项',$data);

您需要使用正则表达式来执行您希望执行的操作,或者实际将字符串解析为XML并进行修改。XML解析几乎肯定是“最安全的”因为只要字符串是有效的XML,它就会以一种可预测的方式工作。正则表达式有时会受到字符串格式不完全符合预期的情况的影响,但是如果您的输入是可预测的,那么它们就可以了。要想用正则表达式做您想做的事情,您可以

$parsed_string = preg_replace("~<div>(?=This is a random item)(.*?)</div>~", "<span>$1</span>, $input_string);
$parsed_string=preg_replace(“~(?=这是一个随机项)(.*?”,“$1,$input_string”);

这里发生的事情是正则表达式正在寻找一个
标记,该标记后面紧跟着(使用前瞻断言)
这是一个随机项
。然后它捕获该标记和下一个
标记之间的任何文本。最后,它将匹配项替换为
,然后是从
div
标记内捕获的文本,然后是
。这在您发布的示例上可以正常工作,但在以下情况下会出现问题:,
标记有一个class属性。如果您希望这样,则需要更复杂的正则表达式,或者完整的XML解析可能是最好的方法。

您需要使用正则表达式来完成您想要做的事情,或者实际将字符串解析为XML并进行修改。XML parsing几乎可以肯定是“最安全的”,因为只要字符串是有效的XML,它就会以可预测的方式工作。正则表达式有时可能会受到字符串格式不完全符合预期的情况的影响,但是如果您的输入足够可预测,它们就可以了。要使用正则表达式实现您想要的功能,您可以

$parsed_string = preg_replace("~<div>(?=This is a random item)(.*?)</div>~", "<span>$1</span>, $input_string);
$parsed_string=preg_replace(“~(?=这是一个随机项)(.*?”,“$1,$input_string”);

这里发生的事情是正则表达式正在寻找一个
标记,该标记后面紧跟着(使用前瞻断言)
这是一个随机项
。然后它捕获该标记和下一个
标记之间的任何文本。最后,它将匹配项替换为
,然后是从
div
标记内捕获的文本,然后是
。这在您发布的示例上可以正常工作,但在以下情况下会出现问题:,
标记有一个class属性。如果您希望这样,要么需要更复杂的正则表达式,要么完整的XML解析可能是最好的方法。

我对其他答案感到有点惊讶,我以为有人会发布一个好的答案,但这没有发生。
stru replace
不是powerful在这种情况下,正则表达式是随意的,您需要编写一个解析器

你不必写一个完整的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);
$in='1!'
(..)
';
$lines=分解(“\n”,单位为“$in”);
$in_段=假;
foreach($nr=>$line的行数){
如果(strstr($line,”)为空{
$in_段落=真;
}else if(strstr($行,

)){ $in_段=假; }否则{ 如果(_段中){ $lines[$nr]=str_替换(数组(“”,)、数组(“”,)、$line); } } } 回波内爆(“\n”,$lines);
这里的关键部分是检测你是否在一个段落中。只有当你在一个段落中时,才进行字符串替换


注意:我正在换行(
\n
)这并不完美,但在本例中有效。您可能希望改进这一部分。

我对其他答案感到有点惊讶,我以为有人会发布一个好的答案,但这并没有发生。
stru 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);
$in='1!'
(..)
';
$lines=分解(“\n”,单位为“$in”);
$in_段=假;
foreach($nr=>$line的行数){
如果(str