用“ span”元素替换“ div”元素

时间:2018-10-15 07:12:16

标签: php regex replace

具有以下文本:

<html>
<HEAD>
<style type="text/css">
.zwischenueberschrift_3, .zwischenueberschrift{
    color:red;
    font-weight: bold;
}
</style>
</HEAD>
<body>
<inhalt bez="text" sprache="DE">
    <objekt type="xhtml">
        <div class="text">Amet totam deleniti voluptate corporis wisi, donec alias, aspernatur enim leo, sunt, cursus sollicitudin pellentesque tortor rutrum rerum, magna tenetur aliquid ducimus 
        incidunt sociosqu, mollitia dicta totam gravida dignissi.</div>
        <div class="zwischenueberschrift_3">Nostra lobortis magni, eum dapibus nemo culpa augue ligula class! Magna ullamcorper! Reiciendis porttitor cum vitae. Beatae primis dictum adipisicing 
        deserunt duis posuere magna <br />
        </div>
        <div class="text">rovident viverra? Parturient egestas, condimentum! Mollitia anim? Ullam! Saepe dis, sem? Arcu esse class optio atque! Minima incidunt voluptatem porta eaque animi! Nibh dis, 
        tincidunt aliquet? Perferendis massa eiusmod eius? Aut, nobis! Explicabo penatib:<br />
            <ul>
                <li>reiciendis, laboris facilis bibendum, .<br />
                    <br />
                </li>
                <li>porro, facilis felis? Ridiculus dicta! Integer luctus laoreet rhoncus, habita max. 50 %  corrupti,  3.000 kg  habitant corrupti, . <br />
                    <br />
                </li>
                <li>tur quidem, eos consequat:<br />- Bis 23.09.2016 für Oktober, November, Dezember<br />- Bis 14.10.2016 für November, Dezember, Januar<br />- Bis 11.11.2016 für Dezember, Januar, 
                Februar<br />- Bis 09.12.2016 für Januar, Februar, März</li>
                <br />
                <li>ed imperdiet et phasellus adipiscing! Bibendum. Ad. Maiores pellentesque! Mauri.<br />
                    <br />
                </li>
                <li> Habitant dolore! Vestibulum! Conubia quaerat. Minima, nihil penatibus magna adipisci! Ultricies dignissim hic imperdiet. Tempus, distinctio.<br />
                    <br />
                </li>
                <li>e, quae beatae inceptos labore sunt excepturi id, neque saepe quae tellus. N bei 50 bis 80 % das 0,8-fache (11,2 Cent/kg), bei 20 bis 50% das 0,5-fache (7 Cent/kg) und bei 
                weniger als 20% tus dapibus occa.<br />
                    <br />
                </li>
                <li>la, platea. Reprehenderit   <br />
                    <br />
                </li>
                <li>celerisque convallis occaecat im Jahr 2017.  <br />
                    <br />
                </li>
                <li>Ddolore id? Ea sint? Netus quasi vulputate bis zum 23.09.2016 nutzen.</li>
            </ul>
        </div>
        <div class="zwischenueberschrift">litora magni assumenda! Magnis </div>
        <div class="text">llentesque consectetuer voluptatum purus ratione, temporibus deleniti eveniet ullamco eget nostrud? Sodales fusce. Nostrum culpa saepe quis penatibus accusantium? Sagittis 
        porttitor minima nunc ab fermentum incidunt class urna, tempor, ullamcorper quod beatae? Nostra cubilia felis? Mus pretium fames etiam, cras, velit nec quae, voluptates quas voluptas dis 
        inceptos porro dolorem ligula.t.<br /> <br />entium! Consectetuer tenetur, auctor wisi? Voluptatibus reiciendis unde convallis justo incidunt? Itaque leo? Mollit odio ultricies asperiores 
        ullamco parturient sociosqu reiciendis incidunt consequat. Ut est? Impedit pellentesque fringilla eligendi? Mi ear </div>
        <div class="zwischenueberschrift_3">tpat eros, maiores totam cupi<br />
        </div>
        <div class="text">Excepteur saepe occaecati elit. Ex mauris do porttitor? Convallis molestie, consectetuer culpa. Voluptatum dolor ipsum adipiscing, quia, laudantium mi totam. Beatae quae. 
        Praesent excepturi, nemo fringilla similique quisquam sapiente totam fermentum fuga arcu . </div>
</objekt>       
</inhalt>
…
</body>
</html>

在文本中,类别为 zwischenueberschrift zwischenueberschrift_3 的所有 div 元素均应替换为 span
css类仅用于显示类元素。

我已经建立了一个正则表达式,可以为我找到这些元素,但是很遗憾,我无法替换它们:-(
这里的表达式:

<div\sclass\=\"zwischenueberschrift(\_\d|)\"\>[a-zA-Z0-9ÄÖÜäöüß\s\-\<\/\>\.\!\,\r\n\t]+\<\/div\>

我用来替换div元素的东西要么工作不充分,要么根本不起作用:-(

$preg ='/<div\sclass\=\"zwischenueberschrift(\_\d|)\"\>[a-zA-Z0-9ÄÖÜäöüß\s\-\<\/\>\.\!\,\r\n\t]+\<\/div\>/';

if( preg_match($preg, $text )){
    $a2 = preg_match_all($preg, $text , $a1 );

    if( is_integer($a2) && intval( $a2) > 0 )
    {
        $sammeln = '';

        $arr_text_zum_ersetzten = array();
        $arr_preg = array();
        foreach( $a1[0] as $key => $value )
        {
            #echo "$key, ".strlen($value)."<br>";

            $text_zum_ersetzten='';
            $text_zum_ersetzten = str_replace("div", "span", $value);
            $text_zum_ersetzten = str_replace("zwischenueberschrift_3", "zwischenueberschrift", $text_zum_ersetzten);
            $text_zum_ersetzten = str_replace("<br />", "", $text_zum_ersetzten);           
            $arr_text_zum_ersetzten[] = $text_zum_ersetzten;            

            $value = str_replace("<", "\<", $value);
            $value = str_replace(">", "\>", $value);
            $value = str_replace("_", "\_", $value);
            $value = str_replace("/", "\/", $value);
            $value = str_replace('"', '\"', $value);
            $value = str_replace("=", "\=", $value);
            $value = str_replace("-", "\-", $value);
            $arr_preg[] = "/".$value."/";

            $sammeln.=$value."\n";
            $sammeln.=$text_zum_ersetzten."\n\n";           
        }
        preg_replace( $arr_preg, $arr_text_zum_ersetzten, $text);

        # Loging to testing, start
        $sammeln.="++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n";
        $text.="++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n";      
        error_log($sammeln, 3, "sammeln_22.log");
        error_log($text, 3, "text11.log");      
        # Loging to testing, ende
    }
}

有没有人想到仅通过正则表达式使它更可靠?

问候 网络用户

2 个答案:

答案 0 :(得分:1)

这是我所能做的最好的事情

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server / {
   limit_req zone=one burst=20 nodelay;
......
}

输出

function parse($subject, $tokens)
{
    $types = array_keys($tokens);
    $patterns = [];
    $lexer_stream = [];
    $result = false;
    foreach ($tokens as $k=>$v){
        $patterns[] = "(?P<$k>$v)";
    }
    $pattern = "/".implode('|', $patterns)."/i";

    if (preg_match_all($pattern, $subject, $matches, PREG_OFFSET_CAPTURE)) {
        //print_r($matches);
        foreach ($matches[0] as $key => $value) {
            $match = [];
            foreach ($types as $type) {
                $match = $matches[$type][$key];
                if (is_array($match) && $match[1] != -1) {
                    break;
                }
            }
            $tok  = [
                'content' => $match[0],
                'type' => $type,
                'offset' => $match[1]
            ];
            $lexer_stream[] = $tok;
        }

        $result = parseTokens( $lexer_stream );
    }
    return $result;
}

function parseTokens( array &$lexer_stream ){
    $result = '';
    $nesting = [0];
    $index = 0;
    while($current = current($lexer_stream)){
        $content = $current['content'];
        $type = $current['type'];
        switch($type){
            case 'T_EOF': return $result;               
            case 'T_START_DIV':                   
                if(preg_match('/zwischenueberschrift/i', $content)){
                    ++$index;
                    if(!isset($nesting[$index])) $nesting[$index] = 0;
                    $content = str_replace('div', 'span', $content);
                }                      
                ++$nesting[$index];                   
            break;
            case 'T_END_DIV':
                  --$nesting[$index];
                 if(!$nesting[$index] && $index){
                     unset($nesting[$index]);
                     if(empty($nesting)) $nesting = [0];
                     --$index;
                     if($index < 0)$index=0;
                     $content = str_replace('div', 'span', $content);
                 }
            break;    

            case 'T_UNKNOWN':
            default:
                //print_r($current);
               //trigger_error("Unknown token $type value $content", E_USER_ERROR);
        }
        $result .= $content;
        next($lexer_stream);
    }
}

/**
 * token should be "name" => "regx"
 * 
 * Order is important
 * 
 * @var array $tokens
 */
$tokens = [
    'T_EOF'             => '\Z',
    'T_START_DIV'      => '<\s*div[^>]*>',
    'T_END_DIV'        => '<\s*\/\s*div[^>]*>',
    'T_UNKNOWN'         => '.+?'
];

$html = <<<HTML
<html>
<HEAD>
<style type="text/css">
.zwischenueberschrift_3, .zwischenueberschrift{
    color:red;
    font-weight: bold;
}
</style>
</HEAD>
<body>
<inhalt bez="text" sprache="DE">
    <objekt type="xhtml">
        <div class="text">Amet totam deleniti voluptate corporis wisi, donec alias, aspernatur enim leo, sunt, cursus sollicitudin pellentesque tortor rutrum rerum, magna tenetur aliquid ducimus 
        incidunt sociosqu, mollitia dicta totam gravida dignissi.</div>
        <div class="zwischenueberschrift_3">Nostra lobortis magni, eum dapibus nemo culpa augue ligula class! Magna ullamcorper! Reiciendis porttitor cum vitae. Beatae primis dictum adipisicing 
        deserunt duis posuere magna <br />
        </div>
        <div class="text">rovident viverra? Parturient egestas, condimentum! Mollitia anim? Ullam! Saepe dis, sem? Arcu esse class optio atque! Minima incidunt voluptatem porta eaque animi! Nibh dis, 
        tincidunt aliquet? Perferendis massa eiusmod eius? Aut, nobis! Explicabo penatib:<br />
            <ul>
                <li>reiciendis, laboris facilis bibendum, .<br />
                    <br />
                </li>
                <li>porro, facilis felis? Ridiculus dicta! Integer luctus laoreet rhoncus, habita max. 50 %  corrupti,  3.000 kg  habitant corrupti, . <br />
                    <br />
                </li>
                <li>tur quidem, eos consequat:<br />- Bis 23.09.2016 für Oktober, November, Dezember<br />- Bis 14.10.2016 für November, Dezember, Januar<br />- Bis 11.11.2016 für Dezember, Januar, 
                Februar<br />- Bis 09.12.2016 für Januar, Februar, März</li>
                <br />
                <li>ed imperdiet et phasellus adipiscing! Bibendum. Ad. Maiores pellentesque! Mauri.<br />
                    <br />
                </li>
                <li> Habitant dolore! Vestibulum! Conubia quaerat. Minima, nihil penatibus magna adipisci! Ultricies dignissim hic imperdiet. Tempus, distinctio.<br />
                    <br />
                </li>
                <li>e, quae beatae inceptos labore sunt excepturi id, neque saepe quae tellus. N bei 50 bis 80 % das 0,8-fache (11,2 Cent/kg), bei 20 bis 50% das 0,5-fache (7 Cent/kg) und bei 
                weniger als 20% tus dapibus occa.<br />
                    <br />
                </li>
                <li>la, platea. Reprehenderit   <br />
                    <br />
                </li>
                <li>celerisque convallis occaecat im Jahr 2017.  <br />
                    <br />
                </li>
                <li>Ddolore id? Ea sint? Netus quasi vulputate bis zum 23.09.2016 nutzen.</li>
            </ul>
        </div>
        <div class="zwischenueberschrift">litora magni assumenda! Magnis </div>
        <div class="text">llentesque consectetuer voluptatum purus ratione, temporibus deleniti eveniet ullamco eget nostrud? Sodales fusce. Nostrum culpa saepe quis penatibus accusantium? Sagittis 
        porttitor minima nunc ab fermentum incidunt class urna, tempor, ullamcorper quod beatae? Nostra cubilia felis? Mus pretium fames etiam, cras, velit nec quae, voluptates quas voluptas dis 
        inceptos porro dolorem ligula.t.<br /> <br />entium! Consectetuer tenetur, auctor wisi? Voluptatibus reiciendis unde convallis justo incidunt? Itaque leo? Mollit odio ultricies asperiores 
        ullamco parturient sociosqu reiciendis incidunt consequat. Ut est? Impedit pellentesque fringilla eligendi? Mi ear </div>
        <div class="zwischenueberschrift_3">tpat eros, maiores totam cupi<br />
        </div>
        <div class="text">Excepteur saepe occaecati elit. Ex mauris do porttitor? Convallis molestie, consectetuer culpa. Voluptatum dolor ipsum adipiscing, quia, laudantium mi totam. Beatae quae. 
        Praesent excepturi, nemo fringilla similique quisquam sapiente totam fermentum fuga arcu . </div>
</objekt>       
</inhalt>
…
</body>
</html>        
HTML;

Sandbox

与普通的正则表达式不同,它可以处理以下内容:

<html>
<HEAD>
<style type="text/css">
.zwischenueberschrift_3, .zwischenueberschrift{
    color:red;
    font-weight: bold;
}
</style>
</HEAD>
<body>
<inhalt bez="text" sprache="DE">
    <objekt type="xhtml">
        <div class="text">Amet totam deleniti voluptate corporis wisi, donec alias, aspernatur enim leo, sunt, cursus sollicitudin pellentesque tortor rutrum rerum, magna tenetur aliquid ducimus 
        incidunt sociosqu, mollitia dicta totam gravida dignissi.</div>
        <span class="zwischenueberschrift_3">Nostra lobortis magni, eum dapibus nemo culpa augue ligula class! Magna ullamcorper! Reiciendis porttitor cum vitae. Beatae primis dictum adipisicing 
        deserunt duis posuere magna <br />
        </span>
        <div class="text">rovident viverra? Parturient egestas, condimentum! Mollitia anim? Ullam! Saepe dis, sem? Arcu esse class optio atque! Minima incidunt voluptatem porta eaque animi! Nibh dis, 
        tincidunt aliquet? Perferendis massa eiusmod eius? Aut, nobis! Explicabo penatib:<br />
            <ul>
                <li>reiciendis, laboris facilis bibendum, .<br />
                    <br />
                </li>
                <li>porro, facilis felis? Ridiculus dicta! Integer luctus laoreet rhoncus, habita max. 50 %  corrupti,  3.000 kg  habitant corrupti, . <br />
                    <br />
                </li>
                <li>tur quidem, eos consequat:<br />- Bis 23.09.2016 für Oktober, November, Dezember<br />- Bis 14.10.2016 für November, Dezember, Januar<br />- Bis 11.11.2016 für Dezember, Januar, 
                Februar<br />- Bis 09.12.2016 für Januar, Februar, März</li>
                <br />
                <li>ed imperdiet et phasellus adipiscing! Bibendum. Ad. Maiores pellentesque! Mauri.<br />
                    <br />
                </li>
                <li> Habitant dolore! Vestibulum! Conubia quaerat. Minima, nihil penatibus magna adipisci! Ultricies dignissim hic imperdiet. Tempus, distinctio.<br />
                    <br />
                </li>
                <li>e, quae beatae inceptos labore sunt excepturi id, neque saepe quae tellus. N bei 50 bis 80 % das 0,8-fache (11,2 Cent/kg), bei 20 bis 50% das 0,5-fache (7 Cent/kg) und bei 
                weniger als 20% tus dapibus occa.<br />
                    <br />
                </li>
                <li>la, platea. Reprehenderit   <br />
                    <br />
                </li>
                <li>celerisque convallis occaecat im Jahr 2017.  <br />
                    <br />
                </li>
                <li>Ddolore id? Ea sint? Netus quasi vulputate bis zum 23.09.2016 nutzen.</li>
            </ul>
        </div>
        <span class="zwischenueberschrift">litora magni assumenda! Magnis </span>
        <div class="text">llentesque consectetuer voluptatum purus ratione, temporibus deleniti eveniet ullamco eget nostrud? Sodales fusce. Nostrum culpa saepe quis penatibus accusantium? Sagittis 
        porttitor minima nunc ab fermentum incidunt class urna, tempor, ullamcorper quod beatae? Nostra cubilia felis? Mus pretium fames etiam, cras, velit nec quae, voluptates quas voluptas dis 
        inceptos porro dolorem ligula.t.<br /> <br />entium! Consectetuer tenetur, auctor wisi? Voluptatibus reiciendis unde convallis justo incidunt? Itaque leo? Mollit odio ultricies asperiores 
        ullamco parturient sociosqu reiciendis incidunt consequat. Ut est? Impedit pellentesque fringilla eligendi? Mi ear </div>
        <span class="zwischenueberschrift_3">tpat eros, maiores totam cupi<br />
        </span>
        <div class="text">Excepteur saepe occaecati elit. Ex mauris do porttitor? Convallis molestie, consectetuer culpa. Voluptatum dolor ipsum adipiscing, quia, laudantium mi totam. Beatae quae. 
        Praesent excepturi, nemo fringilla similique quisquam sapiente totam fermentum fuga arcu . </div>
</objekt>       
</inhalt>
…
</body>
</html>   

输出

$html = <<<HTML
<div class="zwischenueberschrift_3">
    <div>
        <div>
            <div class="zwischenueberschrift">
                <div>Nostra lobortis </div>
                magni, eum dapibus nemo culpa augue ligula class!
            </div>
        </div>
    </div>
</div>
HTML;

Sandbox

或者换句话说就是嵌套。嵌套是杀死纯正则表达式解决方案的原因。对于正则表达式,由于没有很好的跟踪方式,而且结束标记中也没有可使用的信息(它们全为<span class="zwischenueberschrift_3"> <div> <div> <span class="zwischenueberschrift"> <div>Nostra lobortis </div> magni, eum dapibus nemo culpa augue ligula class! </span> </div> </div> </span> ),因此它不知道哪个结束标记变为开始标记。

有很多方法可以进行递归匹配,但是它们往往使事情变得复杂,并有自己的问题。

(使用Regex)会发现第一个打开标签与第一个关闭标签匹配,这是不正确的。基本上是这样:

</div>

对不起,但是我现在没有时间解释它的工作原理。这是一件复杂的事情。并需要一些时间来解释这一切。

您不清楚该如何处理这些类的问题,所以我只剩下它们了,但是您可以在IF中对此进行更改:

<div class="zwischenueberschrift_3"> <!-- this would be a span start tag -->
    <div>
        <div>
            <div class="zwischenueberschrift">
                <div>Nostra lobortis </div> <!-- this would be a span end tag -->

享受!

答案 1 :(得分:0)

感谢您的支持。 对我来说,解决方案是@Pushpesh Kumar Rajwanshi

(?s)<div\s+class="zwischenueberschrift(?:_3)?">(.*?)<\/div>