Php удалить тег div

Удалить все теги div из строки php regex?

У меня есть wysiwyg на сайте. Проблема заключается в том, что пользователи копируют много данных в нее, оставляя много незакрытых и неправильно отформатированных тегов div, которые нарушают макет сайта.

Легкий ли простой способ удалить все вхождения

и

?

str_replace не будет работать, потому что у некоторых из есть стиль и другие вещи в них, поэтому ему нужно будет учитывать и т.д.

Я предполагаю, что это можно сделать с регулярным выражением, но я все-таки новичок, когда дело доходит до них.

Нет. Вы никогда не разбираете/не манипулируете HTML с помощью регулярных выражений.

С regexes нельзя торговаться. С ними нельзя рассуждать. Они не понимают html, они не grok xml. И они абсолютны НЕ будут останавливаться, пока ваше дерево DOM не будет мертвым.

Вы используете htmlpurifier и/или DOM для управления деревом.

Лучше использовать DOM для парсера HTML, но если у вас нет выбора, кроме как использовать RegEx, вы можете использовать его следующим образом:

$patterns = array(); $patterns[0] = '/]*>/'; $patterns[1] = '//'; $replacements = array(); $replacements[2] = ''; $replacements[1] = ''; echo preg_replace($patterns, $replacements, $html); 

Здесь упрощенный пример того, как вы могли бы это сделать с PHP

  $val) < $text = mb_str_replace($key, $val, $text); >return $text; > function worker(&$body, &$replacements, $id) < static $call_count; if (empty($call_count)) < $call_count = array(); >if (empty($call_count[$id])) < $call_count[$id] = 0; >if (mb_strpos($body, '
')) < $body = mb_str_replace('
', '', $body); > if (mb_strpos($body, '') . '>'; // Builds the replacements HTML $replacement_html = ''; $next_id = count($replacements); $replacement_id = "[[div-$next_id]]"; $replacements[$replacement_id] = $replacement_html; $body = mb_str_replace($rm, $replacement_id, $body); if (mb_strpos($body, ' > > /** * Returns text by specifying a start and end point * * @param str $str * The text to search * @param str $start * The beginning identifier * @param str $end * The ending identifier */ function xml_get($str, $start, $end) < $str = "|" . $str . "|"; $len = mb_strlen($start); if (mb_strpos($str, $start) >0) < $int_start = mb_strpos($str, $start) + $len; $temp = right($str, (mb_strlen($str) - $int_start)); $int_end = mb_strpos($temp, $end); $return = trim(left($temp, $int_end)); return $return; >else < return FALSE; >> function right($str, $count) < return mb_substr($str, ($count * -1)); >function left($str, $count) < return mb_substr($str, 0, $count); >/** * Multibyte str replace */ if (!function_exists('mb_str_replace')) < function mb_str_replace($search, $replace, $subject, &$count = 0) < if (!is_array($subject)) < $searches = is_array($search) ? array_values($search) : array($search); $replacements = is_array($replace) ? array_values($replace) : array($replace); $replacements = array_pad($replacements, count($searches), ''); foreach ($searches as $key =>$search) < $parts = mb_split(preg_quote($search), $subject); $count += count($parts) - 1; $subject = implode($replacements[$key], $parts); >> else < foreach ($subject as $key =>$value) < $subject[$key] = mb_str_replace($search, $replace, $value, $count); >> return $subject; > > $html =
up vote 0 down vote favorite

I have a wysiwyg on a site. The problem is that the users are copy pasting a lot of data in to it leaving a lot of unclosed and improperly formatted div tags that are breaking the site layout.

Is there an easy an easy way to strip all occurrences of <div> and </div>?

str_replace won't work because some of the divs have styling and other things in them so it would need to account for <div style="some styling"> <div align="center"> etc

I'm guessing this could be done with a regular expression but I am total a total beginner when it comes to those.

Thanks a lot, Martin

php regex replace str-replace strip-tags
share|improve this question
edited Mar 7 '12 at 18:32
asked Mar 7 '12 at 18:31
Martin Hunt
313 7 20
1  
So you need to remove all the div tags but not the content between the div. Am I right? – Siva Charan Mar 7 '12 at 18:34
    
Replace the XPath with //div[not[@*]] to remove all div elements (incl. content) without attributes. – Gordon Mar 7 '12 at 19:58
add a comment | 
HTML; echo strip_divs($html);

Источник

Регулярные выражения для удаления тегов

Подборка регулярных выражений для удаления HTML тегов и атрибутов.

Удаление тегов

$text = '

Текст текст

'; echo preg_replace('/\s?]*?>.*?\s?/si', ' ', $text);

Результат:

По аналогии удаление тегов

, и :

echo preg_replace('/\s?]*?>.*?\s?/si', ' ', $text); echo preg_replace('/\s?]*?>.*?\s?/si', ' ', $text); echo preg_replace('/\s?]*?>.*?\s?/si', ' ', $text);

Удаление атрибутов

Результат:

Удалить все атрибуты у тегов:

Результат:

Удалить атрибуты только у определенных HTML тегов:

$text = preg_replace("/()/i", '\\1\\2', $text); $text = preg_replace("/()/i", '\\1\\2', $text);

Удаление тегов в ячейках таблицы

Регулярные выражения удаляют теги

и , но оставляет их содержание.

$text = ' 
text 1

text 2

text 3
'; // Удаление

$text = preg_replace('/(]*>)(.*)(]*>)(.*)()(.*)()/i', '\\1\\2\\4\\6\\7', $text); // Удаление

$text = preg_replace('/(]*>)(.*)(]*>)(.*)()(.*)()/i', '\\1\\2\\4\\6\\7', $text); print_r($text);

Результат:

Комментарии

Другие публикации

Регулярные выражения для замены на теги

Поиск похожих текстов в базе данных MySQL + PHP

Работа с FTP в PHP

Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.

Contenteditable – текстовый редактор

Если добавить атрибут contenteditable к элементу, его содержимое становится доступно для редактирования пользователю, а.

Как дописать стили в атрибут style тегов HTML через PHP

Данный вопрос возникает при верстке писем т.к. стили прописанные в head в почтовых сервисах и программах не работают, а.

Автоматическое оглавление для статьи

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

Источник

strip_tags

Эта функция пытается возвратить строку str , из которой удалены все NULL-байты, HTML и PHP теги. Для удаления тегов используется тот же автомат, что и в функции fgetss() .

Список параметров

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

Замечание:

Комментарии HTML и PHP-теги также будут удалены. Это жестко записано в коде и не может быть изменено с помощью параметра allowable_tags .

Замечание:

Этот параметр не должен содержать пробелов. strip_tags() рассматривает тег как нечувствительную к регистру строку, находящуюся между и первым пробелом или >.

Замечание:

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

Возвращаемые значения

Возвращает строку без тегов.

Список изменений

Версия Описание
5.3.4 strip_tags() больше не удаляет соответвующие закрывающие XHTML теги, если они не переданы в allowable_tags .
5.0.0 strip_tags() теперь безопасна для обработки бинарных данных.

Примеры

Пример #1 Пример использования strip_tags()

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

Примечания

Из-за того, что strip_tags() не проверяет валидность HTML, то частичные или сломанные теги могут послужить удалением большего количества текста или данных, чем ожидалось.

Эта функция не изменяет атрибуты тегов, разрешенных с помощью allowable_tags , включая такие атрибуты как style и onmouseover, которые могут быть использованы озорными пользователями при посылке текста, отображаемого также и другим пользователям.

Замечание:

Имена тегов в HTML превышающие 1023 байта будут рассматриваться как невалидные независимо от параметра allowable_tags .

Смотрите также

Источник

Как в php удалить из строки определенные теги? Функция strip_tags удалет все кроме определенных. А мне нужно только определенные. Как это сделать?

Знаю, что регулярки — не лучший способ( https://stackoverflow.com/questions/11229831/regul. ). Думаю, что можно попробовать внести все существующие теги в массив. Потом найти расхождение у этого массива с массивом, в котором те теги, которые я хочу удалить. И потом применить strip_tags. Как вы думаете, хороший вариант? Вот бы только упростить как-нибудь создание массива со всеми тегами.

sorry_i_noob

static public function create_dom($string = null) < $dom = new DOMDocument(); // ---------------------------------------------------------------- // Делается обертка в виде 
для $string. Это нужно, так как из-за LIBXML_HTML_NOIMPLIED теги могут выводиться несколько некорректно. Подробности по ссылке: // https://stackoverflow.com/questions/29493678/loadhtml-libxml-html-noimplied-on-an-html-fragment-generates-incorrect-tags // Также добавляется кодировка - так как без вместо текста, полученного от ckeditor, будут кракозябры. // ---------------------------------------------------------------- $dom->loadHTML('' . '
' . $string . '
', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $container = $dom->getElementsByTagName('div')->item(0); $container = $container->parentNode->removeChild($container); while ($dom->firstChild) < $dom->removeChild($dom->firstChild); > while ($container->firstChild) < $dom->appendChild($container->firstChild); > return $dom; > static public function unwrap_tags($string, $tags) < $dom = static::create_dom($string); foreach ($dom->childNodes as $c) < if (in_array($c->tagName, $tags)) < // если просто добавить в $result $c->nodeValue, то не добавятся внутренние теги (
, например), ведь их нет в nodeValue. foreach ($c->childNodes as $cc) < $result .= $cc->ownerDocument->saveHTML($cc); > > else < $result .= $c->ownerDocument->saveHTML($c); > > return $result; > static public function prepare_text($text)

Источник

Читайте также:  Html больше чем body
Оцените статью