Php 查找<;br/>;标记内部<;ins></ins>;标记并替换它

Php 查找<;br/>;标记内部<;ins></ins>;标记并替换它,php,regex,Php,Regex,例如,我有: <br/> <ins> <br/> <br/> </ins> 我想找到和标记之间的所有,并将它们更改为:br/。这个修正将允许我的diff算法实际进行换行,并显示插入了新行。现在的例子如下: <br/> <ins> <br/>&lt;br/&gt; <br/>&lt;br/&gt; </ins> br/ br/ 我不

例如,我有:

<br/>
<ins>
<br/>
<br/>
</ins>



我想找到
标记之间的所有

,并将它们更改为:

br/
。这个修正将允许我的diff算法实际进行换行,并显示插入了新行。现在的例子如下:

<br/>
<ins>
<br/>&lt;br/&gt;
<br/>&lt;br/&gt;
</ins>


br/
br/
我不知道如何用PHP实现这一点。我知道这需要使用
preg\u replace
preg\u replace\u callback
,但我自己不知道如何使用正则表达式


或(使用预定义函数)



regexes+html=改用。这听起来可能很愚蠢,但DOM看起来是一项不必要的工作,那么你可以用preg_replace写一行,然后忘掉它。除非你能保证你要重新定义的html永远不会格式错误/无效,否则最好使用一个明确设计用于处理html的工具。正则表达式适用于99.9%,但您可能需要100%。@Stribizev您编写的代码将



更改为

我的坏代码,必须对其进行解码。工作起来很有魅力。我认为这是一种非常安全的方法,因为我在应用正则表达式之前净化了html代码
<?php
$content = "<br/>
<ins>
<br/>
<br/>
</ins>
<ins>
<br/>
<br/>
</ins>
<br/>";

// Find all the positions from where <ins> is starting
$lastPos = 0;
$positions = array();
$count = 1;
while(($lastPos = strpos($content,"<ins>",$lastPos))!==false) {
    $positions[] = $lastPos;$lastPos=$lastPos+strlen("<ins>");
}
foreach($positions as $value) {
    ${"one".$count} = $value;$count++;
}

// Find all the positions from where </ins> is starting
$lastPos = 0;
$positions = array();
$count = 1;
while(($lastPos = strpos($content,"</ins>",$lastPos))!==false) {
    $positions[] = $lastPos;$lastPos=$lastPos+strlen("</ins>");
}
foreach($positions as $value) {
    ${"two".$count} = $value;$count++;
}

// Store the elements present inside all the <ins></ins> tags in PHP variables and replace <br/> with <br/>&lt;br/&gt;
for($i=1;$i<=$count-1;$i++)
{
    ${"area".$i} = substr($content,${"one".$i}+5,${"two".$i}-${"one".$i}-5);
    if(strpos(${"area".$i},"<br/>")) ${"area_new".$i} = str_replace("<br/>","<br/>&lt;br/&gt;",${"area".$i});
}

for($i=1;$i<=$count-1;$i++)
{
    $content = str_replace(${"area".$i},${"area_new".$i},$content);
}
// Now $content contains what you wanted it to be.
?>
<?php
$content = "<br/>
<ins>
<br/>
<br/>
</ins>
<ins>
<br/>
<br/>
</ins>
<br/>";
$content = preg_replace('~(?:<ins>|(?!^)\G)\s*<br\/>~', '$0&lt;br/&gt;', $content);
?>