Php убрать теги

В течение долгого времени я пользуюсь функцией PHP HTML “очистки” пользовательского ввода, чтобы гарантировать, что никакой вредоносный код не будет размещен нарочно или случайно. Но при этом я разрешаю использовать определенные HTML-теги и атрибуты:

Большая часть функций для работы с HTML-кодом используют регулярные выражения, а это сплошная головная боль. В течение длительного времени созданная мной функция работала достаточно хорошо, пока мне не понадобилось разрешить внутри некоторых тегов data-атрибуты HTML5.

Они выглядят следующим образом:

data-conversation=»none»

После “data” идет имя переменной для соответствующего типа данных. И здесь старая версия моей функции не смогла справиться с этой переменной частью имени, и мне приходилось добавлять каждый тип данных атрибута в используемый мной список.

В итоге я разработал улучшенную функцию, которая использует PHP библиотеку DOMDocument, чтобы создать объектную модель документа и удалить всё кроме тегов и атрибутов, которые необходимо сохранить.

Новый подход позволяет использовать регулярное выражение только для выбранных типов данных — не надо искать эти атрибуты в HTML-коде. Задача поиска тегов и атрибутов осуществляется с помощью XPath методов PHP DOMDocument.

Новая функция удаления HTML тегов в PHP принимает строку для “очистки” и два массива в качестве параметров; массивы — список разрешенных тегов и список допустимых атрибутов. Если атрибуты “href” или “src” разрешены, функция проверяет: если значение атрибута – это код JavaScript, то изменяет его на “#”:

Перед тем, как с помощью PHP убрать HTML теги, расскажу о нескольких проблемах, связанных с использованием DOMDocument:

  1. Если вы парсите фрагмент кода вместо всей страницы, и в нем нет тега кодировки символов, то DOMDocument будет считать, что текст закодирован в ISO-8859 вместо UTF-8. Поэтому, прежде чем загрузить фрагмент кода, эта функция использует mb_convert_encoding, чтобы преобразовать любые символы Unicode в объекты HTML. Затем использует html_entity_decode, чтобы преобразовать объекты назад в символы, когда парсинг завершится;
  2. Когда вы парсите HTML- фрагмент, DOMDocument всегда добавляет DOCTYPE, <HTML> и <Body> теги к фрагменту, и вы не можете отключить эту «опцию«. Поэтому после парсинга моя функция использует strip_tags во второй раз, чтобы удалить лишние и ненужные теги.

Два массива тегов и атрибутов похожи на комментарии. Заметьте, что последний элемент в массиве $commentAttributes — простое регулярное выражение, которое соответствует любому типу данных атрибута:

Кстати, при удалении HTML тегов из PHP соблюдаются дополнительные меры санитизации (где добавлены комментарии). Например, изображения могут быть встроены только в комментарии, если они загружены и размещены на сайте, иначе они превращаются в ссылки на внешние изображения. Это необходимо для предотвращения распространения изображений, содержащих вредоносный код, порно и т. д.

Перевод статьи “Tech Note: A PHP Function to Strip Specific HTML Tags and Attributes” был подготовлен дружной командой проекта Сайтостроение от А до Я.

www.internet-technologies.ru

Проверка и обработка входящих данных является одной из распространённых задач в программировании. Язык PHP обычно используется для веб-приложений, поэтому здесь наиболее актуально удаление HTML тегов из текста, ведь именно они наиболее подверженны сторонним инъекциям. В данной статье я хочу напомнить Вам о старичке stip_tags() и его фишках, а также предложить решения для удаления секционных HTML тегов и ещё парочку полезных бонусов вдогонку.

И так. Основным нашим инструментом для удаления HTML тегов из текста является функция strip_tags(). Мы передаём ей строковое значение, а она удаляет из него HTML и PHP теги, например:

$s = ‘<p>Параграф.</p><!— Комментарий —> <a href=»/2014/08/»>Еще текст</a>.’;
echo strip_tags($s);

Этот пример выведет строку:

Параграф. Еще текст.

Примечательно здесь то, что у функции имеется и второй (не обязательный, но полезный) параметр, значением которого является строка с перечнем разрешенных HTML тегов, например:

$s = ‘<p>Параграф.</p><!— Комментарий —> <a href=»/2014/08/»>Еще текст</a>.’;
echo strip_tags($s, ‘<p><a>’);

Этот пример выведет строку:

<p>Параграф.</p> <a href=»/2014/08/»>Еще текст</a>.

По моему, очень удобно. Тем не менее, это не решает одну важную проблему – удаление секционных HTML тегов, например: script, noscript и style – они наиболее распространённые. Когда мне нужно убрать такие секционные теги, а также варианты начинающиеся с «<» и заканчивающиеся символом «>», я использую следующий PHP код:

$p = array(
  «‘<script[^>]*?>.*?</script>’si»,
  «‘<noscript[^>]*?>.*?</noscript>’si»,
  «‘<style[^>]*?>.*?</style>’si»,
  «‘<[/!]*?[^<>]*?>’si»,
);
$r = array(» «,» «,» «,» «);
$s = preg_replace($p, $r, $s);

Здесь переменная $p содержит массив регулярных выражений, а $r – массив соответствующей их замены (я использую пробелы). Осталось лишь провести замену в строке, и мы уберём HTML мусор из текста.

Очевидно, что два выше приведённых решения можно совместить. В начале я использую замену через регулярные выражения, а потом strip_tags() и у меня получается своя функция nohtml().

Напоследок хочу предложить Вам ещё несколько полезных решений. Так в тексте лучше заменить табуляцию пробелом, результат интерпретации того и другого в браузере идентичны, а хлопот будет меньше, например:

$s = str_replace(«t», » «, $s);

Если Вам не нужны переносы строк, их тоже можно заменить пробелами, например:

$s = str_replace(array(«n», «r»), » «, $s);

От лишних же пробелов можно избавиться простым регулярным выражением, например:

$s = preg_replace(«/s+/», ‘ ‘, $s);
$s = trim($s); // будет не лишним

На этом у меня всё. Спасибо за внимание. Удачи!

www.chuvyr.ru

Многие спрашивают: Как удалить все теги из текса? 

Php убрать тегиВот несколько вариантов:

1. Используя функцию strip_tags &mdash Удаляет HTML и PHP-теги из строки

<?php  $text = '<p>Параграф.</p><!-- Комментарий --> <a href="#fragment">Еще текст</a>';  echo strip_tags($text);  echo "n";    // Разрешаем <p> и <a>  echo strip_tags($text, '<p><a>');  ?>

Результат выполнения данного примера:

Параграф. Еще текст

<p>Параграф.</p> <a href=»#fragment»>Еще текст</a>

2. Используя регулярные выражения:

<?php  // $document на выходе должен содержать HTML-документ.  // Необходимо удалить все HTML-теги, секции javascript,  // пробельные символы. Также необходимо заменить некоторые  // HTML-сущности на их эквивалент.     $search = array ("'<script[^>]*?>.*?</script>'si",  // Вырезает javaScript                   "'<[/!]*?[^<>]*?>'si",           // Вырезает HTML-теги                   "'([rn])[s]+'",                 // Вырезает пробельные символы                   "'&(quot|#34);'i",                 // Заменяет HTML-сущности                   "'&(amp|#38);'i",                   "'&(lt|#60);'i",                   "'&(gt|#62);'i",                   "'&(nbsp|#160);'i",                   "'&(iexcl|#161);'i",                   "'&(cent|#162);'i",                   "'&(pound|#163);'i",                   "'&(copy|#169);'i",                   "'&#(d+);'e");                    // интерпретировать как php-код     $replace = array ("",                    "",                    "\1",                    """,                    "&",                    "<",                    ">",                    " ",                    chr(161),                    chr(162),                    chr(163),                    chr(169),                    "chr(\1)");     $text = preg_replace($search, $replace, $document);  ?>

В результате получите чистый текст без HTML тегов

w1c.ru

С задачей очистки html от лишних тегов сталкиваются абсолютно все.

Первое, что приходит на ум, это использовать php-функцию strip_tags():

string strip_tags (string str [, string allowable_tags])

Функция возвращает строку, очищенную от тегов. В качестве аргумента allowable_tags передаются теги, которые не надо удалять. Функция работает, но, мягко говоря, неидеально. По ходу, там нет проверки на валидность кода, что может повлечь за собой удаление текста, не входящего в тэги.
Инициативные разработчики сложа руки не сидели — в сети можно найти доработанные функции. Хорошим примером является strip_tags_smart.

Применять или не применять готовые решения — личный выбор программиста. Так сложилось, что мне чаще всего не требуется «универсального» обработчика и бывает удобнее почистить код регулярками.

От чего зависит выбор того или иного способа обработки?

1. От исходного материала и сложности его анализа.
Если вам нужно обрабатывать достаточно простые htmp-тексты, без какой-либо навороченной верстки, ясные, как день :), то можно использовать стандартные функции.
Если в текстах есть определенные особенности, которые надо учесть, то тут-то и пишутся специальные обработчики. В одних может использоваться просто str_replace. Например:

$s = array('&acirc;&euro;&trade;' => '&rsquo;', // Right-apostrophe (eg in I'm)
'&acirc;&euro;&oelig;' => '&ldquo;', // Opening speech mark
'&acirc;&euro;&ldquo;' => '&mdash;', // Long dash
'&acirc;&euro;' => '&rdquo;', // Closing speech mark
'&Atilde;&copy;' => '&eacute;', // e acute accent
chr(226) . chr(128) . chr(153) => '&rsquo;', // Right-apostrophe again
chr(226) . chr(128) . chr(147) => '&mdash;', // Long dash again
chr(226) . chr(128) . chr(156) => '&ldquo;', // Opening speech mark
chr(226) . chr(128) . chr(148) => '&mdash;', // M dash again
chr(226) . chr(128) => '&rdquo;', // Right speech mark
chr(195) . chr(169) => '&eacute;', // e acute again
);

foreach ($s as $needle => $replace)
{
$htmlText = str_replace($needle, $replace, $htmlText);
}

Другие могут быть основаны на регулярных выражениях. Как пример:

function getTextFromHTML($htmlText)
{
$search = array ("'<script[^>]*?>.*?</script>'si", // Remove javaScript
"'<style[^>]*?>.*?</style>'si", // Remove styles
"'<xml[^>]*?>.*?</xml>'si", // Remove xml tags
"'<[/!]*?[^<>]*?>'si", // Remove HTML-tags
"'([rn])[s] '", // Remove spaces
"'&(quot|#34);'i", // Replace HTML special chars
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&#(d );'e"); // write as php

$replace = array ("",
"",
"",
"",
"\1",
""",
"&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\1)");

return preg_replace($search, $replace, $htmlText);
}

(В такие минуты как никогда радует возможность preg_replace работать с массивами в качестве параметров). Массив вы при необходимости дополняете своими регулярками. Помочь в их составлении вам может, например, этот конструктор регулярных выражений. Начинающим разработчикам может быть полезной статья «All about HTML tags. 9 Regular Expressions to strip HTML tags». Посмотрите там примеры, проанализируйте логику.

2. От объемов.
Объемы напрямую связаны со сложностью анализа (из предыдущего пункта). Большое количество текстов увеличивает вероятность, что, пытаясь предусмотреть и почистить все регулярками, вы можете что-нибудь да упустить. В этом случае подойдет метод «многоступенчатой» очистки. То есть очистить сначала, допустим, функцией strip_tags_smart (исходники на всякий случай не удаляем). Потом выборочно просматриваем некоторое количество текстов на выявление «аномалий». Ну и «зачищаем» аномалии регулярками.

3. От того, что надо получить в результате.
Алгоритм обработки может быть упрощен разными способами в зависимости от ситуации. Случай, описанный мной в одной из предыдущих статей, хорошо это демонстрирует. Напомню, текст там находился в div-е, в котором кроме него был еще div с «хлебными крошками», реклама адсенс, список похожих статей. При анализе выборки статей обнаружилось, что статьи не содержат рисунков и просто разбиты на абзацы с помощью <p></p>. Чтобы не чистить «главный» див от посторонних вещей, можно найти все абзацы (с Simple HTML DOM Parser это очень просто) и соединить их содержимое. Так что прежде чем составлять регулярки для чистки, посмотрите, нельзя ли обойтись малой кровью.

Вообще, между сторонниками парсинга html-кода, основанного чисто на регулярных выражениях, и парсинга, в основе которого лежит анализ DOM-структуры документа, в сети разгораются настоящие холивары. Вот, например, на оверфлоу. Невинный с первого взгляда вопрос вызвал очень бурное обсуждение (особенно обратите внимание на первый коммент, за который проголосовало уже более 3 тысяч человек, — чувак отжег 🙂 ).
В общем, каждый выбирает то, что ему ближе и что лучше подходит для конкретной ситуации.

А какой способ предпочитаете вы?
___

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

parsing-and-i.blogspot.com

Как убрать html теги из текста

От автора: допустим, у вас есть кусок кода с каким-то содержимым, а вам нужно получить из него только текст. Вручную удалять все теги может быть очень долго и нудно, поэтому давайте разбираться, как с помощью php убрать html теги.

Если вам надо убрать из текста html-теги, то вам может пригодиться одна php-функция, которая хорошо справляется с этим заданием. Что она делает? Мы ей передаем нужную строку с кодом, а она вырезает оттуда все html и php-команды, возвращая содержимое без кода. Это функция strip_tags, которая имеет один обязательный и один необязательный параметры.

Соответственно, давайте сразу же протестируем ее работу.

На экран выведется фраза “Это текст в абзаце”. Соответственно, вторым параметром можно задать те теги, которые не нужно удалять.

В этой случае мы запретили функции удалять тег span и на экран он выведется вместе с текстом. Я думаю, основная цель strip_tags вам понятна. Если в коде присутствуют комментарии, то они тоже будут удалены. Но что, если удалить теги надо из целого файла? Для этого есть другая команда, которую рассмотрим далее.

Как убрать html теги из текста с помощью fgetss()

Эта команда отличается от предыдущей тем, что позволяет убрать html теги из всего файла. Для этого его предварительно необходимо открыть с помощью fopen(), в которой указывается путь до файла и режим, котором будет работа с ним.

Сама функция fgetss содержит три параметра. Первым является указатель на файл, с которого надо убирать лишнее. Второй параметр – длина получаемых данных, можно увидеть в блокноте или любом текстовом редакторе. Записывается в виде числового значения. Третий и необязательный параметр – разрешенные теги, которые не будут удалены. Этот параметр записывается также, как и для функции strip_tags.

Php убрать теги

Что мы в данном случае сделали:

После этого файл закрывается. Пользоваться функцией есть смысл, когда необходимо удалить теги из файла, где их может быть сотни.

Убираем html-теги с помощью онлайн сервиса

Возможно, у вас нет желания пользоваться возможностями php для очищения текста от ненужных элементов. Что ж, есть способ гораздо более простой. Это онлайн сервис 0en.ru, который может удалять html дескрипторы и комментарии из скопированного в поле текста. С его помощью можно получить чистый текст уже через несколько секунд.

Единственный минус веб-сервиса в том, что он удаляет абсолютно все, поэтому если вы хотите какие-то из них оставить, то лучше все-таки воспользоваться одной из функций PHP.

Замена символов

Ну а что, если вам нужно удалить всего лишь 1-2 тега на странице. Сделать это еще проще. В любом нормальном текстовом редакторе есть функция “найти и заменить”. В первое поле вы вписываете символы, которые нужно найти (нужный нам открывающий тег), а во второе – на что его заменить. Здесь просто оставляем пустое место. Клац, и все удалилось. Соответственно, если тег парный, то нужно не забыть удалить и его закрывающую часть.

Php убрать теги

Сегодня мы с вами узнали несколько способов удаления html тегов из текста. Используйте если надо и читайте наш блог, чтобы узнавать еще больше о веб-технологиях.

Php убрать теги

webformyself.com

Аномалия PHP file_exists () Попытка получить полный URL-адрес без имени файла в PHP Magento Цена доставки зависит от страны. Как я могу это сделать? как разделить массив запятыми? Предупреждение: getimagesize () : Имя файла не может быть пустым предупреждающим сообщением? Проблема с поиском запроса jQuery JSONP twitter Передача SMS / текстовых сообщений через PHP Как загрузить классы Zend при запуске php-скрипта по командам каждый понедельник месяца в PHP mime type validation в laravel 4 не работает пейджинг, например, stackoverflow Aptana 3.0.4 и отладка PHP Разделить большие файлы с помощью PHP PHP: подключение: сохранить данные о состоянии чтения сокетов Eclipse indigo PDT 3.0 получил

ruphp.com

You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.