В приложении PHP, которое я пишу, я хотел бы, чтобы пользователи вводили в тексте сочетание HTML и текста с заостренными скобками, но когда я показываю этот текст, я хочу, чтобы теги HTML отображались с помощью тегов, отличных от HTML. быть показаны литературно, например пользователь должен иметь возможность вводить:
<b> 5 > 3 = true</b>
при отображении пользователь должен увидеть:
5> 3 = верно
Как лучше всего это проанализировать, т.е. найти все скобки, отличные от HTML, преобразовать их в & gt; и & lt ;?






Я бы рекомендовал, чтобы пользователи вводили разметку стиля BBcode, которую вы затем заменяли тегами html:
[b]This is bold[/b]
[i]this is italic with a > 'greater than' sign there[/i]
Это дает вам больше контроля над тем, как вы анализируете ввод пользователя в html, хотя я признаю, что это выглядит как ненужное бремя.
Лучшим способом было бы сделать наоборот: вместо того, чтобы находить скобки, отличные от HTML, и экранировать их, сначала избегайте всего, а затем ищите <b> и </b> и снимайте экранирование только в этих особых случаях. Таким образом, вы не рискуете, что пользователь внедрит вредоносный HTML-код на вашу страницу (если вы попытаетесь скрыть только то, что необходимо, вы рискуете пропустить что-то важное).
Если вы разрешаете пользователю вводить HTML, вам нужно решить гораздо более серьезную проблему, чем несколько неэкранированных угловых скобок; HTML действительно сложно проверить и правильно отфильтровать, и если вы не сделаете это правильно, вы подвергнетесь атакам XSS. Я написал библиотеку, которая делает это; кто-то уже разместил ссылку на это здесь, поэтому я не буду повторяться.
Однако, чтобы ответить на ваш вопрос, наиболее надежный способ преобразования случайных угловых скобок в их экранированные формы - это синтаксический анализ HTML с помощью DOM / libxml, а затем его повторная сериализация. Все, что использует регулярные выражения или что-то подобное, будет обречено на неудачу из-за крайнего случая. Вы также можете написать свой собственный синтаксический анализатор, но это также потребует некоторой работы.
Однако на самом деле это не доходит до корня проблемы: если он хочет разрешить HTML / BBCode, ему придется иметь дело с XSS. Написать хороший синтаксический анализатор BBCode нетривиально; написание хорошего парсера HTML тем более.