PHP — использование strip_tags для УДАЛЕНИЯ текста между удаленными тегами

#php #strip-tags

#php #strip-теги

Вопрос:

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

 <?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).

Ответ №1:

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

 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. Вам нужно использовать РЕГУЛЯРНОЕ выражение тем или иным способом.

Комментарии:

1. Да, но можно ли это сделать без использования preg_replace (т.е.. Мне нужно более быстрое решение ..). Поскольку strip_tags знает, что нужно заменить, поэтому, возможно, его можно использовать для удаления текста между найденными strip_tags..

2. Я не думаю, что есть какое-либо прямое решение вашей проблемы с использованием PHP во встроенных функциях. Вы должны использовать регулярное ВЫРАЖЕНИЕ так или иначе.

Ответ №2:

Как насчет подхода 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.
  

Комментарии:

1. Это тоже может сработать (хотя теперь мне интересно, что быстрее, preg_replace или это решение 🙂