标记

时间:2015-12-05 22:59:27

标签: php regex domdocument

我想修改:

<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);

不知道为什么这种方法不好。

1 个答案:

答案 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>