#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 или это решение 🙂