Php очищення від html тегів. PHP: як прибрати HTML теги з тексту? Повне очищення тексту від html-тегів

Перевірка та обробка вхідних даних є одним із найпоширеніших завдань у програмуванні. Мова PHP зазвичай використовується для веб-додатків, тому тут найбільш актуальне видалення HTML тегів з тексту, адже саме вони найбільше піддаються стороннім ін'єкціям. У цій статті я хочу нагадати Вам про старичку stip_tags() і його фішки, а також запропонувати рішення для видалення секційних HTML тегів і ще кілька корисних бонусів навздогін.

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

$s = "

Параграф.

Ще текст.";
echo strip_tags($s);

Цей приклад виведе рядок:

Параграф. Ще текст.

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

$s = "

Параграф.

Ще текст.";
echo strip_tags($s, "

Цей приклад виведе рядок:

Параграф.

Ще текст.

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

$ p = array (
""]*?>.*?"si",
""]*?>.*?"si",
""]*?>.*?"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); // буде не зайвим

На цьому маю все. Дякую за увагу. Успіхів!

о 21:56 Змінити повідомлення

Із завданням очищення html від зайвих тегів стикаються всі.

Перше, що спадає на думку, це використовувати php-функцію strip_tags():
string strip_tags (string str [, string allowable_tags])

Функція повертає рядок, очищений від тегів. Як аргумент allowable_tags передаються теги, які треба видаляти . Функція працює, але, м'яко кажучи, неідеально. По ходу, там немає перевірки на валідність коду, що може спричинити видалення тексту, що не входить до теги.
Ініціативні розробники склавши руки не сиділи – у мережі можна знайти допрацьовані функції. Хорошим прикладом є strip_tags_smart.

Застосовувати чи застосовувати готові рішення — особистий вибір програміста. Так склалося, що мені найчастіше не потрібно "універсального" обробника і зручніше почистити код регулярками.

Від чого залежить вибір чи іншого способу обробки?

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

$s = array("’" => "'", // Right-apostrophe (eg in I"m)
"“" => "“", // Opening speech mark
"â"" => "-", // Long dash
"€" => """, // Closing speech mark
"Ã" => "é", // e acute accent
chr(226). chr(128). chr(153) => "'", // Right-apostrophe again
chr(226). chr(128). chr(147) => "-", // Long dash again
chr(226). chr(128). chr(156) => """, // Opening speech mark
chr(226). chr(128). chr(148) => "-", // M dash again
chr(226). chr(128) => """, // Right speech mark
chr(195). chr(169) => "é", // e acute again
);

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

Інші можуть бути засновані на регулярних виразах. Як приклад:

Function getTextFromHTML($htmlText)
{
$search = array (""]*?>.*?"si", // Remove javaScript
""]*?>.*?"si", // Remove styles
""]*?>.*?"si", // Remove xml tags
"""si", // Remove HTML-tags
""([\r\n])[\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 з "хлібними крихтами", реклама адсенс, список схожих статей. При аналізі вибірки статей виявилося, що статті містять малюнків і просто розбиті на абзаци з допомогою . Щоб не чистити "головний" див від сторонніх речей, можна знайти всі абзаци (з Simple HTML DOM Parser це дуже просто) і з'єднати їх вміст. Тому перш ніж складати регулярки для чищення, подивіться, чи не можна обійтися малою кров'ю.

Взагалі між прихильниками парсингу html-коду, заснованого суто на регулярних виразах, і парсингу, в основі якого лежить аналіз DOM-структури документа, в мережі розгоряються справжні холівари. Ось, наприклад, на оверфлоу. Невинний з першого погляду

Завдання видаляти всі або тільки певні HTML-теги з рядка часто виникає там, де необхідно надати можливість будь-якому відвідувачу сторінки, додавати нову інформацію. Найпростішим прикладом може бути гостьова книга або система коментарів на сайті. Текст, що додається, може містити безліч різних тегів, доданих випадково при копіюванні тексту або навмисно, щоб внести повідомлення якось "дуже оригінально". Варто відзначити також і зловмисні спроби внести на сайт шкідливий код у тегах script або спробу зіпсувати верстку сторінки зайвими тегами.

У будь-якому з перерахованих випадків виникає необхідність перед записом нової інформації, очищати її від зайвих html-тегів.

Повне очищення тексту від html-тегів

Часто для таких завдань використовуються регулярні вирази, однак у цій статті розглянемо найпростіший метод – видалення тегів за допомогою функції php strip_tags. Ця функція просто видаляє теги із зазначеного у параметрі рядка.

$str_in = "

Мій текст з різнимитегами.

" ;
$str_out = strip_tags($str_in);
echo $str_out;

В результаті такої обробки в змінній $str_out отримаємо рядок без тегів:

Мій текст з різних тегів.

* Варто звернути увагу, що функція strip_tags прибирає тільки самі теги, залишаючи їх вміст між тегом, що відкриває і закриває.

Видалення окремих html-тегів із тексту

Іноді потрібно прибрати лише певні теги з рядка. Тут ми також скористаємося функцією strip_tags, але цього разу другим (необов'язковим) параметром вкажемо теги, які потрібно зберегти.

Наприклад, при обробці рядка, потрібно залишити лише посилання:

$str_in = "

Мій текст з різнимитегами.

" ;
$str_out = strip_tags($str_in, " " );
echo $str_out;

В результаті такої обробки в змінній $str_out отримаємо:

Мій текст з різних тегів.

Таким чином, можна вказати всі теги, які допустимі в рядку, тоді як решта буде видалена.


У цій статті розглянуто найпростіший спосіб очищення рядка від тегів. Розглядаючи інші варіанти, я розширюватиму цю статтю. Буду радий, якщо Ви запропонуєте свої варіанти вирішення цього завдання у коментарях або електронною поштою.

У Вас у браузері заблокований JavaScript. Дозвольте JavaScript для роботи сайту!

strip_tags

(PHP 3> = 3.0.8, PHP 4, PHP 5)

strip_tags - Видаляє HTML та PHP теги з рядка Опис string strip_tags (string str [, string allowable_tags])

Ця функція повертає рядок str, з якого видалено HTML та PHP теги. Для видалення тегів використовується автомат, аналогічний застосованому функції fgetss() .

Необов'язковий другий аргумент може бути використаний для вказівки тегів, які не потрібно видаляти.

Примітка: Аргумент allowable_tags був доданий до PHP 3.0.13 та PHP 4.0b3. З версії PHP 4.3.0 також видаляються HTML коментарі.

Увага

Оскільки strip_tags() не перевіряє коректність HTML коду, незавершені теги можуть призвести до видалення тексту, що не входить до теги.

Приклад 1. Приклад використання strip_tags() $text = "

Параграф.

Ще трохи тексту"; echo strip_tags($text); echo "\n\n-------\n"; // не видаляти

Echo strip_tags($text, "

"); // Дозволяємо ,, echo strip_tags($text, " ");

Цей приклад виведе:

Параграф. Ще трохи тексту ------

Параграф.

Ще трохи тексту

Увага

Ця функція не змінює атрибути тегів, зазначених у аргументі allowable_tags, включаючи style та onmouseover.

З версії PHP 5.0.0 strip_tags() безпечна для обробки даних у двійковій формі.

Ця функція має істотний недолік - це склеювання слів при видаленні тегів. Крім цього, функція має вразливості. Альтернативна функція аналог strip_tags:

Дивіться також опис функції