LINUX.ORG.RU

Ограничение html


0

0

Необходимо реализовать добавку сообщений на форум. Тут возник вопрос как сделать распознование некоторых тегов в тексте. Т.е. например если <a href="aaaa"></a>, то так и передать, а другие изменить, так чтобы они на странице появились в виде обычного текста. Т.е. необходим мини движок для форума или лучше совет, как это проще сделать, может пример. Язык Java(jsp).

★★

Лучше посмотреть в сторону готовых движков для форума! (imho лучше на php)

UVV ★★★★★
()
Ответ на: комментарий от UVV

>Лучше посмотреть в сторону готовых движков для форума! (imho лучше на php)

Готовый был (как раз на php phpBB), но у нас в сети данные о всех пользователях есть в бд, т.е . не надо регится + есть личные странички пользователей + новости, хотелось все это связать.

olegk ★★
() автор топика
Ответ на: комментарий от theserg

Пусть на perl: язык - всего инструмент. Идею подкинте на perl, пожалуйста, а я разберусь и на perl или ,если надо, на php.

olegk ★★
() автор топика
Ответ на: комментарий от olegk

неразберешься ты в перле, ты а пыхпыхе просишь функцию, а в перле тебе надо юзать регекспы, а это не так просто.

anonymous
()
Ответ на: комментарий от anonymous

Понятно, что с помощью регулярных выражений, но как их граммотно применить в данном случае не знаю. Когда просто надо что-то выдрать из строки это одно, другое дело когда надо обработать согласно всем правилам html. В голову пришло просто проверять соответствие строки схеме документа XML. Т.е. дополнить и проверить. Но это не решает, всех проблем. Так что я в тупике.

olegk ★★
() автор топика

Ничего не поделать, прийдеться писать самому синтаксический парсер html, т.е. выделять тэги (не забыть про коментарии), а потом принимать решение принимать тот или иной тэг или нет.
Конечный автомат тебе в руки.

anonymous
()
Ответ на: комментарий от anonymous

млин, а HTML::Parser и HTML::TokeParse в перл уже отменили?? Нафига писать автомат, когда его уже написали?

anonymous
()

Никого не слушай %)

Просто перед выдачей замени "<" и ">" на "&lt;" и "&gt;" соответственно, и твои "тэги в сообщениях" не будут интерпретироваться браузером.

MOByte
()
Ответ на: комментарий от MOByte

>Никого не слушай %)

>Просто перед выдачей замени "<" и ">" на "&lt;" и "&gt;" соответственно, и твои "тэги в сообщениях" не будут интерпретироваться браузером.

Это понятно, задача то совсем в другом:) Надо оставлять некоторые тэги.

olegk ★★
() автор топика
Ответ на: комментарий от olegk

> Понятно, что с помощью регулярных выражений, но как их граммотно
> применить в данном случае не знаю.

Имхо, регэкспами в этом случае не дело. Если у тебя на входе именно
HTML, а не BBcode или что там еще, то его парсинг в общем случае -
нетривиальная задача. Рэгэкспы будут длинные, и отлаживать это ты
запаришься.

Проще всего решить этот вопрос, затребовав на входе XHTML, и используя
любой подручный XML-парсер. Или еще лучше - сразу XSLT накатать для
соответствующего преобразования, он там будет в несколько строк, не
больше.

int19h ★★★★
()
Ответ на: комментарий от int19h

> Имхо, регэкспами в этом случае не дело. Если у тебя на входе именно
> HTML, а не BBcode или что там еще, то его парсинг в общем случае -
> нетривиальная задача. Рэгэкспы будут длинные, и отлаживать это ты
> запаришься.
>

В принципе правильно но причина более глубокая - regexp'ы
не могут быть использованы для анализа balanced expressions
произвольной вложенности.

Onanim
()
Ответ на: комментарий от int19h

>Проще всего решить этот вопрос, затребовав на входе XHTML, и используя любой подручный XML-парсер.

Так и решил делать. Описать схему документа в XSD, а потом с помощью javax.xml.validation.Schema проверить - это я уже сделал. Оно то работает, но одна проблема не решена: а если написать

<html> - это тег .... смотри <a href="blabla">тут</a>

Выдаст ошибку, т.к. <html> не определен. Придется написать вверху инструкию для пользователей:)

olegk ★★
() автор топика
Ответ на: комментарий от int19h

А если просто парсить, то тут возникает вопрос, а если тэг <html> как в примере выше не закрыт, что делать? Как на него парсер отреагирует.

Или при нахождении не знакомого парсера в строке заменять < > на &lt; &gt; и парсить заново?

olegk ★★
() автор топика
Ответ на: комментарий от olegk

Идея-то старая:

1) Удаляешь все __MY-SUPER-TAG1__ и __MY-SUPER-TAG2__

2) Заменяешь все <a href></a> на __MY-SUPER-TAG1__...__MY-SUPER-TAG2__

3) Удаляешь все тэги html

4) Заменяешь обратно __MY-SUPER-TAG1__...__MY-SUPER-TAG2__ на <a href...>

theserg ★★★
()
Ответ на: комментарий от theserg

>Идея-то старая:

Идея то старая, но что-то в ней есть:) Надо попробовать.

olegk ★★
() автор топика
Ответ на: комментарий от olegk

> Так и решил делать. Описать схему документа в XSD, а потом с помощью
> javax.xml.validation.Schema проверить - это я уже сделал. Оно то
> работает, но одна проблема не решена: а если написать
>
> <html> - это тег .... смотри <a href="blabla">тут</a>
>
> Выдаст ошибку, т.к. <html> не определен. Придется написать вверху
> инструкию для пользователей:)

Ты не понял. Тебе XSD нафиг не нужен. Определи XSLT-преобразование, и
вперед. Только не забудь обернуть пользовательский ввод в корневой тэг.

> А если просто парсить, то тут возникает вопрос, а если тэг <html> как
> в примере выше не закрыт, что делать? Как на него парсер отреагирует.

Известно как - невалидный XML. Можно смело матюгаться пользователю.

Да, не знаю, где еще такое есть, но вот в xsltproc (того, что из
состава libxslt) есть возможность включить режим парсинга (не вывода, а
именно парсинга!) HTML-документов - ключ --html.

> Или при нахождении не знакомого парсера в строке заменять < > на &lt;
&gt; и парсить заново?

Можно спокойно определить такое XSL-преобразование, которое любой
"незнакомый" тэг преобразует как надо.

int19h ★★★★
()
Ответ на: комментарий от theserg

> Идея-то старая:
> 1) Удаляешь все __MY-SUPER-TAG1__ и __MY-SUPER-TAG2__
>
> 2) Заменяешь все <a href></a> на __MY-SUPER-TAG1__...__MY-SUPER-TAG2__
>
> 3) Удаляешь все тэги html
>
> 4) Заменяешь обратно __MY-SUPER-TAG1__...__MY-SUPER-TAG2__ на <a
> href...>

5) Идешь вешаться, пока фэн-клуб Луговского не объявил сезон охоты на
"быдлокодеров" открытым.

Это хак. Грязный, убогий, глупый, и, что хуже всего, работающий
некорректно. Никогда так не делай.

int19h ★★★★
()
Ответ на: комментарий от int19h

дддддд, это почему? Конкретно:

1) Контрпример, когда это не работает

2) Что есть "хак"?

3) Соответственно, почему на перле там нельзя делать. Я надеюсь, ты знаешь перл:)

theserg ★★★
()
Ответ на: комментарий от theserg

Я конечно не int19h, но немного Perl знаю.
Вспомним твой алгоритм:

> 1) Удаляешь все __MY-SUPER-TAG1__ и __MY-SUPER-TAG2__
> 2) Заменяешь все <a href></a> на __MY-SUPER-TAG1__...__MY-SUPER-TAG2__
> 3) Удаляешь все тэги html
> 4) Заменяешь обратно __MY-SUPER-TAG1__...__MY-SUPER-TAG2__ на <a href...>

Для упрощения выбросим пункт 1 - очевидно, что для каждого
конкрентного текста мы всегда сможем подобрать __MY-SUPER-TAG1__
и __MY-SUPER-TAG2__ такие, что удалений не потребуется.

> 1) Контрпример, когда это не работает

Нельзя привести пример, когда "это" не работает. Просто потому, что
ты "это" не описал. Если для пункта 2 и 3 ты будешь использовать
всякие HTML::Parser и прочие специализированные модули - тады тебе
респект :-) Если же самопальные простенькие regexp'ы - приведи пример
кода. Будем искать контрпример :-)

> 3) Соответственно, почему на перле там нельзя делать.

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

> Я надеюсь, ты знаешь перл:)

Не буду говорить за себя, но если _ты_ знаешь Perl, то наверное
почитываешь comp.lang.perl.misc. И знаешь, как там относятся к
изобретателям HTML-парсеров :-)))

Ждем-с кода ...

Onanim
()
Ответ на: комментарий от Onanim

> Нельзя привести пример, когда "это" не работает. Просто потому, что
> ты "это" не описал. Если для пункта 2 и 3 ты будешь использовать
> всякие HTML::Parser и прочие специализированные модули - тады тебе
> респект :-) Если же самопальные простенькие regexp'ы - приведи пример
> кода. Будем искать контрпример :-)

Если бы он использовал полноценный парсер - зачем ему тогда все эти
__MY-SUPER-TAG__? Нет, товарищ явно нацеливался именно на регэкспы.

А хак это потому, что помимо собственно тэгов, у нас появляется еще
одна некоторая странная сущность - тот самый "SUPER-TAG". Причем
недокументированная. Достаточно будет запостить на форум сообщение с
куском кода этого же форума (а почему нет, кстати?), чтобы увидеть
пример входа, для которого дается некорректный вывод. Т.е. софтина не
соответствует декларируемой спецификации -> в топку, однозначно. На
перле оно или там на VB - это в данном случае перпендикулярно (кстати,
хак на самом деле больше всего напомнил мне именно традиционные методы
BASIC-кодеров).

int19h ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.