Игнорирование незакрытых тегов от другого <div>? - PullRequest
2 голосов
/ 17 июня 2010

У меня есть веб-сайт, на котором участники могут вводить текст, используя ограниченное подмножество HTML.Когда отображается страница, содержащая текст пользователя, если у него есть незакрытые теги, форматирование «перетекает» в следующую область.Например, если пользователь ввел:

Hi, my name is <b>John

Тогда остальная часть страницы будет выделена жирным шрифтом.

В идеале, было бы что-то, что я мог бы сделать, это было бы так просто:

<div contained>Hi, my name is <b>John</div>

И никакие метки не могли кровоточить из этого div.Предполагая, что нет ничего такого простого, как бы я достиг подобного эффекта?Или есть что-то такое простое?

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

Спасибо!

Ответы [ 5 ]

4 голосов
/ 17 июня 2010

У меня есть решение для php

<?php
    // close opened html tags
    function closetags ( $html )
        {
        #put all opened tags into an array
        preg_match_all ( "#<([a-z]+)( .*)?(?!/)>#iU", $html, $result );
        $openedtags = $result[1];
        #put all closed tags into an array
        preg_match_all ( "#</([a-z]+)>#iU", $html, $result );
        $closedtags = $result[1];
        $len_opened = count ( $openedtags );
        # all tags are closed
        if( count ( $closedtags ) == $len_opened )
        {
        return $html;
        }
        $openedtags = array_reverse ( $openedtags );
        # close tags
        for( $i = 0; $i < $len_opened; $i++ )
        {
            if ( !in_array ( $openedtags[$i], $closedtags ) )
            {
            $html .= "</" . $openedtags[$i] . ">";
            }
            else
            {
            unset ( $closedtags[array_search ( $openedtags[$i], $closedtags)] );
            }
        }
        return $html;
    }
    // close opened html tags

?>

Вы можете использовать эту функцию как

   <?php echo closetags("your content <p>test test"); ?>
4 голосов
/ 17 июня 2010

Вы можете поместить фрагмент HTML через Tidy , который сделает все возможное, чтобы исправить это. Многие языки так или иначе включают его, здесь , например, PHP.

1 голос
/ 17 июня 2010

Это невозможно.

Не позволяйте пользователям аннулировать ваш HTML.

Если вы не хотите, чтобы пользователи исправляли свои ошибки, попробуйте их автоматически очистить.

0 голосов
/ 19 сентября 2017

Есть способ сделать это, используя HTML и javascript. Я не рекомендовал бы этот метод для публичных веб-сайтов; Вы должны очистить свои данные, прежде чем они достигнут браузера. Но это может быть полезно в других ситуациях.

Идея состоит в том, чтобы поместить потенциально недопустимый контент в тег noscript, например:

<noscript class="contained">
    <div>Hi, my name is <b>John</div>
</noscript>

... и затем добавьте javascript, который загрузит его в DOM. Использование jQuery (но, вероятно, не обязательно):

$("noscript.contained").each(function () {
    $(this).replaceWith(this.innerText);
});

Обратите внимание, что пользователи без javascript по-прежнему будут испытывать "кровотечение", которого вы пытаетесь избежать.

0 голосов
/ 17 июня 2010

Вы можете анализировать данные, введенные пользователем. Вот что делает XML. Возможно, вам потребуется проанализировать или заменить стандартные символы html или xml, такие как «<», «>», «/», «&» и т. Д., На «& lt», «& gt» и т. Д. *

Таким образом, вы можете достичь всего, что вы хотите.

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