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 и сохранить правильное использование скобки "<" внутри содержимого.

Ну… < разграничивает тег. strip_html удаляет любые теги. Если вам нужен «<» в HTML, вам нужно закодировать его как &lt;.

deceze 31.01.2019 12:23

@deceze правильно, если вы хотите, чтобы больше или меньше не воспринималось как тег, вы должны использовать &gt; или &lt; чтобы указать тогда соответственно.

NiteRain 31.01.2019 12:33

@marco Вы имеете в виду strip_tags, а не strip_html?

yunzen 31.01.2019 12:43

@yunzen Я использую именно strip_tags()

Marco Tesini 31.01.2019 13:28

@MarcoTesini Эй, не могли бы вы отреагировать на мой код? Я снова протестировал его (второй), и он работает, поскольку удаляет все теги html, кроме <a …> и </a>. Если это вам не поможет, вы можете сказать, почему или что не так с моим кодом…

Korne127 04.02.2019 13:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
303
1

Ответы 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>.

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