我想修改:
<ins><br/> <b>bold</b> <br/><br/> <br/> <br/></ins> <br/> <ins> <br/> </ins>
为:
<ins><br/>NL: <b>bold</b> <br/>NL:<br/>NL: <br/>NL: <br/>NL:</ins> <br/> <ins> <br/>NL: </ins>
(在每个<ins>
和</ins>
标记内找到并将<br/>
更改为<br/>NL:
。忽略<br/>
以外的<ins>
。此外,{{ 1}}可能包含各种其他标签)
要做到这一点,我有这样的代码和平:
<ins>
https://regex101.com/r/xI8mW9/4
它可以正常工作,但问题是匹配不会在 $string= preg_replace('~(?:<ins>|(?!^)\G)(.*?)<br\/>~', '$0NL:', $string);
标记之后结束。如何仅使用</ins>
和<br/>
标记将<br/>NL:
替换为<ins>
。它会在第一个</ins>
<br/>
我也试过模式:
<ins>
https://regex101.com/r/xI8mW9/15
(在这种情况下,每个my_br更改为$ 1 $ 2NL:$ 3)问题:如果~(<ins>.*?)(?<my_br><br/>)(?!NL:)(.*?</ins>)~
中<ins><br/></ins><br/><ins><br/></ins>
受影响。
尝试按照评论中的建议使用<br/>
执行此操作:
DOMDocument
出现错误:
$rendered_diff = "Some<ins>a<br/></ins><br/><ins>b<br/></ins>text";
$doc = new \DOMDocument();
$doc->loadHTML($rendered_diff);
$items = $doc->getElementsByTagName('ins');
for ($i = 0; $i < $items->length; $i++) {
foreach ($items->item($i)->childNodes as $node) {
if ($node->nodeName == 'br') {
$node->appendData('NL:');
}
}
}
$doc->saveHTML();
dd($rendered_diff);
不知道为什么这种方法不好。
答案 0 :(得分:0)
您可以尝试以下代码:
<?php
$rendered_diff = "<br/>Some<ins>a<br/><div>blablaa</div></ins><br/><ins>b<br/></ins>text";
$doc = new \DOMDocument();
$doc->loadHTML($rendered_diff);
$xpath = new DOMXpath($doc);
$items = $doc->getElementsByTagName('ins');
foreach ($xpath->query("//ins/br") as $br) {
$text = $doc->createTextNode('NS:');
$br->parentNode->insertBefore( $text, $br->nextSibling);
}
echo $doc->saveXML();
输出以下内容:
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><br/>Some<ins>a<br/>NS:<div>blablaa</div></ins><br/><ins>b<br/>NS:</ins>text</body></html>
这似乎解决了这个问题。
请注意,我修改了您的初始XML,以测试您的
忽略
之外的<br/>
<ins>
条件。见第1 <br/>
页。
回答你的问题
不知道为什么这种方法不好。
由于this,您的方法并不好,并将其与我上面的代码进行比较:后者看起来更干净吗?而且,它使用XPath,您可以创建更复杂的查询以匹配某些元素,而不仅仅是<br>
内的<ins>