Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将“div”元素替换为“span”元素_Php_Regex_Replace - Fatal编程技术网

Php 将“div”元素替换为“span”元素

Php 将“div”元素替换为“span”元素,php,regex,replace,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 typ

有以下案文:

<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类仅用于显示class元素

我构建了一个正则表达式,可以为我查找这些元素,但不幸的是,我无法替换它们:- 这里有一个表达:

<div\sclass\=\"zwischenueberschrift(\_\d|)\"\>[a-zA-Z0-9ÄÖÜäöüß\s\-\<\/\>\.\!\,\r\n\t]+\<\/div\>
我为替换div元素而构建的内容要么工作不足,要么根本不起作用:-

有没有人提出了一个想法,如何使它更可靠,如果只是通过正则表达式的手段

问候
网络用户

这是我所能做的最好的时间了

享受吧

谢谢你的支持。 对我来说,解决办法是@Pushpesh Kumar Rajwanshi

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

你不应该去解析HTML。你应该使用某种HTML解析器,比如说如果你想使用PHP的话。不是自己使用的,但这是可能的。For和in可以缩小除给定HTML标记以外的所有标记。我可以为这篇文章写一篇,但对我来说太晚了。睡觉的时间到了。有可能,有时可能有点像月亮相位正确的时候,但这是一种非常脆弱的方法。这绝对是DOMDocument或其他类似库的工作,而不是regex。我上面描述的不是脆弱的,而是一个Lexer/解析器。这里的关键不是与PHP和基本标记化相结合,我可以用正则表达式解析器解决这个问题。
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;
<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;
<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>
<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 -->
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;
(?s)<div\s+class="zwischenueberschrift(?:_3)?">(.*?)<\/div>