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.