Пользуюсь на данный момент strip_tags($content, '<a>')
тег для очистки тегов HTML, кроме <a>
тег.
Пример 1: Example "lorem ipsum dolor <sit amet....."
все режет после<
«
Пример 2: если содержимое начинается с "<test lorem ipsum"
Я получаю только пустую строку.
Я пытался проверить это с помощью регулярных выражений, но результат тот же.
preg_replace('/<[^>]*>/', '', $content)
он возвращает тот же результат для проверки.
Мне нужно как-то очистить HTML и сохранить правильное использование «<
«скобка внутри содержимого.
Если вы хотите очистить все теги, кроме простого <a>
а также </a>
, вы можете просто отфильтровать их, заменить их, затем очистить HTML и заменить их обратно, вот так:
<?php
$text = "<a> ahahahasjusjhcbzdeu <div>JEY ssjisuj</div>jn<p> here somehing else </p></a>";
$EndText = str_replace("<a>", "&ATL", $text);
$EndText = str_replace("</a>", "&ATR", $EndText);
$EndText = strip_tags($EndText);
$EndText = str_replace("&ATL", "<a>", $EndText);
$EndText = str_replace("&ATR", "</a>", $EndText);
echo htmlspecialchars($EndText);
?>
Но если вы хотите получить что-то вроде <a href="mywebsite.com"> here </a>
ссылка тоже будет удалена.
Так что вам нужно отфильтровать текст между <a
а также >
(это может быть сделано с explode
, sub_str
а также str_replace
), затем сделайте то же самое, что и в приведенном выше решении, а затем вставьте его снова.
Код, который сделает это:
<?php
$text = "<a>Here something</a><div>Again<a href='website.com'>That's a better link</a> Here</div>";
$Texts = explode("<a", $text);
$Begin = strip_tags(array_shift($Texts));
$Middles = [];
foreach ($Texts as &$value) {
$Middle = explode(">", $value)[0];
array_push($Middles, $Middle);
$Position = strpos($value, ">");
$value = substr($value, $Position+1);
$value = str_replace("</a>", "&htlENDA&", $value);
$value = strip_tags($value);
}
$EndText = $Begin;
for ($i = 0; $i < count($Texts); $i++) {
$EndText = $EndText."<a".$Middles[$i].">".$Texts[$i];
}
$EndText = str_replace("&htlENDA&", "</a>", $EndText);
echo "<br><br>Ende: ".htmlspecialchars($EndText);
?>
Это решит вашу проблему, так как удаляет каждый HTML-тег, кроме <a ... >
а также </a>
Других решений пока нет …