PHP - использование strip_tags для удаления текста между удаленными тегами

У меня есть этот пример кода:

<?php

$string='Left text from tag <div title="hello world" class="CSS">What is <b>going on</b> here?<br> Calm up <em>right now</em>.</div> Right text. Possible another <div title="" class="DD">tag..</div> but not always.';

echo strip_tags($string);
?>

Результат этого кода:

Left text from tag What is going on here? Calm up right now. Right text. Possible another tag.. but not always.

Однако моя цель - УДАЛИТЬ весь текст (включая теги) между тегами, удаленными этой функцией strip_tags. То есть. результат должен быть:

Left text from tag Right text. Possible another but not always.

Я знаю, что это можно сделать с помощью preg_replace, но это слишком медленно, поэтому, возможно, есть более быстрое решение... (не обязательно связанное с функцией strip_tags).

2 ответа

Использование REGEX, на мой взгляд, является лучшим и наиболее компактным решением. Попробуй это:

echo preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $string);

Если вы не хотите использовать preg_replace, используйте настраиваемую функцию strip_tags_content(), упомянутую в руководстве.

function strip_tags_content($text, $tags = '', $invert = FALSE) { 

    preg_match_all('/<(.+?)[\s]*\/?[\s]*>/si', trim($tags), $tags); 
    $tags = array_unique($tags[1]); 

    if(is_array($tags) AND count($tags) > 0) { 
        if($invert == FALSE) { 
            return preg_replace('@<(?!(?:'. implode('|', $tags) .')\b)(\w+)\b.*?>.*?</\1>@si', '', $text); 
         } else { 
             return preg_replace('@<('. implode('|', $tags) .')\b.*?>.*?</\1>@si', '', $text); 
         } 
     } elseif($invert == FALSE) { 
           return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text); 
     } 
     return $text; 
 } 

echo strip_tags_content($string);

Примечание: я не думаю, что желаемый результат может быть достигнут с использованием только функций PHP. Вы должны использовать REGEX тем или иным способом.

Как насчет подхода DOMDocument?

<?php

$string='Left text from tag <div title="hello world" class="CSS">What is <b>going on</b> here?<br> Calm up <em>right now</em>.</div> Right text. Possible another <div title="" class="DD">tag..</div> but not always.';

$dom = new DomDocument();
$dom->loadHTML('<body>' . $string . '</body>');

$stripped = '';
$els = $dom->getElementsByTagName('body')->item(0)->childNodes;
$len = count($els) - 1;
foreach($els as $index => $child) {
    if (is_null($child->tagName))
        $stripped .= ' ' . trim($child->nodeValue);
}
$stripped = substr($stripped, 1);

echo $stripped;

Выход:

Left text from tag Right text. Possible another but not always.
Другие вопросы по тегам