PHP strip_tags Проверка HTML и проверка скобок?

Пользуюсь на данный момент strip_tags($content, '<a>') тег для очистки тегов HTML, кроме <a> тег.

Пример 1: Example "lorem ipsum dolor <sit amet....." все режет после<"

Пример 2: если содержимое начинается с "<test lorem ipsum" Я получаю только пустую строку.

Я пытался проверить это с помощью регулярных выражений, но результат тот же.

preg_replace('/<[^>]*>/', '', $content) он возвращает тот же результат для проверки.

Мне нужно как-то очистить HTML и сохранить правильное использование "<"скобка внутри содержимого.

1 ответ

Если вы хотите очистить каждый тег, кроме простого <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>

Другие вопросы по тегам