Php закрыть все открытые теги

Php закрыть все открытые теги

Функция позволяет закрыть незакрытые HTML-тэги.

function closetags($html)  $single_tags = array('meta','img','br','link','area','input','hr','col','param','base'); preg_match_all('~<([a-z0-9]+)(?: .*)?(?~iU', $html, $result); $openedtags = $result[1]; preg_match_all('~~iU', $html, $result); $closedtags = $result[1]; $len_opened = count($openedtags); if (count($closedtags) == $len_opened)  return $html; > $openedtags = array_reverse($openedtags); for ($i=0; $i  $len_opened; $i++)  if (!in_array($openedtags[$i], $single_tags))  if (FALSE !== ($key = array_search($openedtags[$i], $closedtags)))  unset($closedtags[$key]); > else  $html .= ''.$openedtags[$i].'>'; > > > return $html; >

Автор не я. Кто написал не помню…

Комментарии RSS по email OK

Имхо, баловство это. Для XML бы еще прокатило, но для HTML, с его неявным закрытием «пэшек» перед любым блочным тегом и т.п., это мало что меняет. Да и зачем так изворачиваться, когда есть Tidy? Кстати, список одиночных тегов неполон — как минимум, есть еще INPUT, HR, COL, PARAM и BASE.

SelenIT Решение конечно же для закрытия XHTML. Использовано как раз было из-за отсутствия Tidy. Список одиночных действительно неполон. Добавлю.

Функция позволяет не только закрыть все открытые теги, но и открыть все закрытые которые могут образоваться после вырезания участка кода XHTML из произвольного места.

function closetags($text)  // Выбираем абсолютно все теги if (preg_match_all("/<([/]?)([wd]+)[^>/]*>/", $text, $matches, PREG_SET_ORDER))  $stack = array(); foreach ($matches as $k => $match)  $tag = strtolower($match[2]); if (!$match[1]) // если тег открывается добавляем в стек $stack[] = $tag; elseif (end($stack) == $tag) // если тег закрывается, удаляем из стека array_pop($stack); else // если это закрывающий тег, который не открыт, открываем $text = ''.$tag.'>'.$text; > while ($tag = array_pop($stack)) // закрываем все открытые теги $text .= ''.$tag.'>'; > return $text; >
if (preg_match_all("/<([СЛЭШ/]?)([СЛЭШwСЛЭШd]+)[^>СЛЭШ/]*>/", $text, $matches, PREG_SET_ORDER))

Источник

PHP — автоматическое закрытие всех открытых HTML тегов

Все знают, что в административной панели сайта хорошо править контент страниц в визуальном редакторе, который имеет название WYSIWYG. Вот и наш редактор как-то странно себя начал вести, перестал закрывать HTML теги (не все, а те, которые ему хочется). Т.к. JS программист в это время был в отпуске нужно было срочно исправить проблему. Пришлось вставлять костыль в виде скрипта на PHP, которые будет автоматом закрыть все незакрытые теги.

Разработка интернет-магазинов 

Лучшие цены
на
раскрутку и оптимизацию

сайтов

Разработка интернет-магазинов 

Лучшие цены
на
раскрутку и оптимизацию

сайтов

]*>|i", substr($content, $position), $match)) < $tag = strtolower($match[2]); //игнорируем все одиночные теги if (in_array($tag, $ignored_tags) == FALSE) < //тег открыт if (isset($match[1]) AND $match[1] == '') < if (isset($open_tags[$tag])) $open_tags[$tag]++; else $open_tags[$tag] = 1; >//тег закрыт if (isset($match[1]) AND $match[1] == '/') < if (isset($open_tags[$tag])) $open_tags[$tag]--; >> $position += strlen($match[0]); > else $position++; > //закрываем все теги foreach ($open_tags as $tag => $count_not_closed) < $content .= str_repeat("", $count_not_closed); > return $content; > ?>
$text = close_tags($_POST['body_page']);

Источник

Закрыть открытые HTML-теги в строке

Ситуация — это строка, которая приводит к чему-то вроде этого:

This is some text and here is a bold text then the post stop here.

Поскольку функция возвращает тизер (сводку) текста, он останавливается после определенных слов. Где в этом случае ярлык сильно не закрыт. Но вся строка завернута в абзац.

Можно ли преобразовать приведенный выше результат/вывод в следующее:

This is some text and here is a bold text then the post stop here.

Я не знаю, с чего начать. Проблема в том, что.. Я нашел функцию в Интернете, которая делает это регулярное выражение, но она помещает закрывающий тег после строки.. поэтому он не будет проверяться, потому что я хочу, чтобы все теги open/close в тегах абзаца. Функция, которую я нашел, делает это также неверно:

This is some text and here is a bold text then the post stop here.

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

ОТВЕТЫ

Ответ 1

Вот функция, которую я использовал раньше, которая работает очень хорошо:

function closetags($html) < preg_match_all('#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?#iU', $html, $result); $openedtags = $result[1]; preg_match_all('##iU', $html, $result); $closedtags = $result[1]; $len_opened = count($openedtags); if (count($closedtags) == $len_opened) < return $html; >$openedtags = array_reverse($openedtags); for ($i=0; $i < $len_opened; $i++) < if (!in_array($openedtags[$i], $closedtags)) < $html .= ''; > else < unset($closedtags[array_search($openedtags[$i], $closedtags)]); >> return $html; > 

Лично я бы этого не сделал, используя regexp, но такую ​​библиотеку, как Tidy. Это будет выглядеть примерно так:

$str = '

This is some text and here is a bold text then the post stop here.

'; $tidy = new Tidy(); $clean = $tidy->repairString($str, array( 'output-xml' => true, 'input-xml' => true )); echo $clean;

Ответ 2

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

This text has some in it 

Усечение символа 21 приводит к:

Следующий код основывается на следующем лучшем ответе и исправляет это.

function truncateHTML($html, $length) < $truncatedText = substr($html, $length); $pos = strpos($truncatedText, ">"); if($pos !== false) < $html = substr($html, 0,$length + $pos + 1); >else < $html = substr($html, 0,$length); >preg_match_all('#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?#iU', $html, $result); $openedtags = $result[1]; preg_match_all('##iU', $html, $result); $closedtags = $result[1]; $len_opened = count($openedtags); if (count($closedtags) == $len_opened) < return $html; >$openedtags = array_reverse($openedtags); for ($i=0; $i < $len_opened; $i++) < if (!in_array($openedtags[$i], $closedtags)) < $html .= ''; > else < unset($closedtags[array_search($openedtags[$i], $closedtags)]); >> return $html; > $str = "This text has bold in it"; print "Test 1 - Truncate with no tag: " . truncateHTML($str, 5) . "
\n"; print "Test 2 - Truncate at start of tag: " . truncateHTML($str, 20) . "
\n"; print "Test 3 - Truncate in the middle of a tag: " . truncateHTML($str, 16) . "
\n"; print "Test 4: - Truncate with less text: " . truncateHTML($str, 300) . "
\n";

Надеюсь, что это поможет кому-то там.

Ответ 3

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

Однако я бы предложил использовать что-то вроде HTML Tidy и, в частности, методы repairFile или repaireString .

Ответ 4

Этот метод PHP всегда работал у меня. Он закроет все неблокированные HTML-теги.

function closetags($html) < preg_match_all('#<([a-z]+)(?: .*)?(?#iU', $html, $result); $openedtags = $result[1]; preg_match_all('##iU', $html, $result); $closedtags = $result[1]; $len_opened = count($openedtags); if (count($closedtags) == $len_opened) < return $html; >$openedtags = array_reverse($openedtags); for ($i=0; $i < $len_opened; $i++) < if (!in_array($openedtags[$i], $closedtags))< $html .= ''; > else < unset($closedtags[array_search($openedtags[$i], $closedtags)]); >> return $html; > 

Ответ 5

А как насчет использования PHP класс DOMDocument? Он по сути анализирует HTML и исправляет синтаксические ошибки. Например:

$fragment = "

Title

Unclosed"; $doc = new DOMDocument(); $doc->loadHTML($fragment); $correctFragment = $doc->getElementsByTagName('body')->item(0)->C14N(); echo $correctFragment;

Однако у этого подхода есть несколько недостатков. Во-первых, он оборачивает оригинальный фрагмент в . Вы можете легко избавиться от него с помощью чего-то вроде (preg_) replace() или заменив функцию . ->C14N() какой-нибудь пользовательской функцией innerHTML(), как это предлагается, например, на http://php.net/manual/en/book.dom.php # 89718. Второй ловушкой является то, что PHP выдает предупреждение «недопустимый тег в Entity», если используются HTML5 или пользовательские теги (тем не менее, он все равно будет работать правильно).

Ответ 6

Использование регулярного выражения для этого не является идеальным подходом. Вместо этого вы должны использовать html-парсер для создания допустимой модели объекта документа.

В качестве второго варианта, в зависимости от того, что вы хотите, вы можете использовать регулярное выражение для удаления любых тэгов html из вашей строки, прежде чем поместить их в тег

.

Ответ 7

Я сделал этот код, чтобы сделать работу совершенно правильно.

Это старая школа, но эффективная, и я добавил флаг для удаления незавершенных тегов, таких как «blah blah http://stackoverfl»

public function getOpennedTags(&$string, $removeInclompleteTagEndTagIfExists = true) < $tags = array(); $tagOpened = false; $tagName = ''; $tagNameLogged = false; $closingTag = false; foreach (str_split($string) as $c) < if ($tagOpened && $c == '>') < $tagOpened = false; if ($closingTag) < array_pop($tags); $closingTag = false; $tagName = ''; >if ($tagName) < array_push($tags, $tagName); >> if ($tagOpened && $c == ' ') < $tagNameLogged = true; >if ($tagOpened && $c == '/') < if ($tagName) < //orphan tag $tagOpened = false; $tagName = ''; >else < //closingTag $closingTag = true; >> if ($tagOpened && !$tagNameLogged) < $tagName .= $c; >if (!$tagOpened && $c == ' <') < $tagNameLogged = false; $tagName = ''; $tagOpened = true; $closingTag = false; >> if ($removeInclompleteTagEndTagIfExists && $tagOpened) < // an tag has been cut for exemaple ' blabh blah  "; > 

Ответ 8

если установлен модуль tidy, используйте расширение php tidy:

Ответ 9

Это работает для меня, чтобы закрыть все открытые теги HTML в сценарии.

#iU', $html, $result); $openedtags = $result[1]; preg_match_all('##iU', $html, $result); $closedtags = $result[1]; $len_opened = count($openedtags); if (count($closedtags) == $len_opened) < return $html; >$openedtags = array_reverse($openedtags); for ($i=0; $i < $len_opened; $i++) < if (!in_array($openedtags[$i], $closedtags)) < $html .= ''; > else < unset($closedtags[array_search($openedtags[$i], $closedtags)]); >> return $html; > 

Источник

Закрыть html теги

Имеется ли библиотека, которая проверила текст на наличии незакрытых тегов html.

Получается так, обрезаешь текс, вместе с этим обрезаешь html.

HTML теги ul li a и php
Привет. Есть цикл — <ul> <?php for ($i=0; $i <.

exit() и html теги
Всем привет столкнулся с такой проблемой, к примеру при отправке формы с полями логин и пароль, у.

Вырезать html теги
Вообщем есть гостевая книга. Перед тем как сообщение отправленное пользователем будет добавлено в.

CURL + Html теги
Здравствуйте, как вести html теги "как есть", а не как текст. Например, я вывожу текст и выводится.

html lang="ru"> head> meta charset="UTF-8"> title>Название/title> /head> body> p>Абзац/p> /body> /html>

Отправляю текст, конвертируются bbcody, далее текст необходимо обрезать и записать в бд.

Как обрезать текст так, чтобы все открытые теги были закрыты. Как это сделать через php?

Добавлено через 1 минуту
Имеется какая нибудь легенькая библия или простой пример как так проверить и закрыть.

Цитата

Сообщение от Gerd199

1. С формы поступает текст с HTML
2. Затем с этого текста полностью удаляется код разметки HTML через специальный PHP класс
3. И все, получаем простой «голый» текст без разметки, который урезаем как хочется.

— —
Да, можно как то проверить все ли теги парные через регулярное выражение, но я такого не знаю. Может быть можно на Google’ить такое регулярное выражение? Оно вернет либо true если все теги закрыты, все парные, либо false если есть хотя бы один не закрытый тег. Либо это надо все в цикле гонять, хз. Это мега сложная регулярка должна быть.

Добавлено через 4 минуты
Что-то я не то пишу. Можно же использовать strip_tags? А затем обрезать текст?

Источник

Читайте также:  Изображения
Оцените статью