Как я могу убрать HTML-тэги из строки ColdFusion?

У меня была эта проблема с отношением «Один ко многим, однонаправленный с таблицей соединения» , как ( см. Doctrine Doc ). Я не нашел такого случая ошибки с этим типом отношения через Интернет или через стековый поток, поэтому я выкладываю здесь свое решение, чтобы позволить другим помочь с той же проблемой.

Что вызвало эту проблему:

  1. После обратного проектирования устаревших таблиц БД с ORM ( см. Документ «Как генерировать объекты из существующей базы данных» ), все таблицы также только таблицы соединений получили сущностный класс PHP.
  2. С аннотациями на объект категории я описал присоединение. Результаты этого кода:
/**
 * @ORM\ManyToMany(targetEntity="Category")
 * @ORM\JoinTable(name="category_child",
 *     joinColumns={@JoinColumn(name="category_id", referencedColumnName="id")},
 *     inverseJoinColumns={@JoinColumn(name="category_child_id", referencedColumnName="id")}
 * )
 */
public $children;
  1. @ORM\JoinTable(name="category_child" вызвало, что доктрина хочет создать эту таблицу снова. Один раз из-за уже существующего объекта Category_Child, а затем выражения @ORM\JoinTable, которое указывает на ту же таблицу.

Решение

Решение состояло в том, чтобы удалить сущность Category_Child, которая была создана из реверс-инжиниринга. Если вы использовали сущность Category_Child в некоторых запросах $ em, вы должны выбрать эти данные в обратном направлении. Например. Через родителя, который хранит эти дочерние данные в ArrayCollection, или через DBAL.

11
задан Rajesh Manilal 15 July 2014 в 14:32
поделиться

4 ответа

Отказ от ответственности Я яростный сторонник использования правильного парсера (вместо регулярного выражения) для синтаксического анализа HTML. Однако этот вопрос не о синтаксическом анализе HTML, а о уничтожении его. Для всех задач, выходящих за рамки этого, используйте синтаксический анализатор.


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

Все остальное, вероятно, доставит больше хлопот, чем оно того стоит, но вы можете написать небольшой функция, которая перебирает строку char-by-char один раз и удаляет все, что ' s в скобках тега - например:

  • включите флаг «inTag», как только встретите символ « <»,
  • выключите его, как только встретите «> "
  • копировать символы в выходную строку, пока флаг выключен
  • для повышения производительности, используйте объект Java StringBuilder вместо конкатенации строк

Для части вашего приложения с высокими требованиями это может быть быстрее, чем регулярное выражение. Но регулярное выражение чистое и, вероятно, достаточно быстрое.

Возможно, это модифицированное регулярное выражение имеет для вас некоторые преимущества:

<[^>]*(?:>|$)
  • захватывает незакрытые теги в конце строки
  • копировать символы в выходную строку, пока флаг выключен
  • для повышения производительности, используйте объект Java StringBuilder вместо конкатенации строк

Для части вашего приложения с высокими требованиями это может быть быстрее, чем регулярное выражение. Но регулярное выражение чистое и, вероятно, достаточно быстрое.

Возможно, это модифицированное регулярное выражение имеет для вас некоторые преимущества:

<[^>]*(?:>|$)
  • захватывает незакрытые теги в конце строки
  • копировать символы в выходную строку, пока флаг выключен
  • для повышения производительности, используйте объект Java StringBuilder вместо конкатенации строк

Для части вашего приложения с высокими требованиями это может быть быстрее, чем регулярное выражение. Но регулярное выражение чистое и, вероятно, достаточно быстрое.

Возможно, это модифицированное регулярное выражение имеет для вас некоторые преимущества:

<[^>]*(?:>|$)
  • захватывает незакрытые теги в конце строки
  • [^>] * лучше, чем (. | \ N)

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

15
ответ дан 3 December 2019 в 03:04
поделиться

Лучшим способом обычно является приведение < к & lt; ] и с > по & gt; . Таким образом, вы не делаете предположений о природе сообщения. Кто-то может говорить о или пытается быть <> , или описывает нажатие клавиши + C или использует математику 1 3 . Даже смайлы могут запускать регулярное выражение <8P X>

<cfloop from="1" to="#ArrayLen(myFeed.item)#" index="i">
    <cfset myFeed.item[i].description.value = ReplaceList(myFeed.item[i].description.value, '<,>', '&lt;,&gt;')>
</cfloop>
2
ответ дан 3 December 2019 в 03:04
поделиться

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

Рассмотрим, например, следующий допустимый сегмент HTML:

<img src="boat.jpg" alt="a boat" title="My boat is > everything! I <3 my boat!">

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

Если вы не уверены, , что строка, которую вы обрабатываете, не будет содержать HTML-код, подобный приведенному выше, вам следует избегать предположений / компромиссов, которые вынудит вас сделать один / чистый маршрут регулярного выражения.

(Примечание: та же проблема относится к также предлагаемый метод char-by-char.)


Чтобы решить вашу проблему, вы должны использовать парсер DOM, чтобы преобразовать вашу строку в объект HTML, перебирая каждый элемент и преобразовывая в текст.

Если у вас есть действующий XHTML, вы можете использовать CF XmlParse () для создания объекта, который затем можно зациклить. Если это может быть не XML HTML, тогда в CF8 нет встроенной опции, поэтому вам придется изучить опции в Java и т. Д.

7
ответ дан 3 December 2019 в 03:04
поделиться

cflib ваш друг: stripHTML

2
ответ дан 3 December 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: