Найти и заменить и редактор WYSIWYG - PullRequest
1 голос
/ 19 февраля 2009

Моя проблема заключается в следующем:

У меня есть столбец: ProductName. Теперь текст, введенный здесь, вводится с tinyMCE, поэтому он имеет все виды тегов. Пользователь хочет иметь возможность находить и заменять все продукты, и он должен поддерживать раскраску.

Например - скажем, это часть ProductName:

другой текст .. <strong>text text <font color="#ff6600">colortext&reg;</font></strong> ..другий текст

Теперь пользователь хочет заменить:

<font color="#ff6600">colortext&reg;</font>

Исходное имя содержит тег <strong>, поэтому оно выделено жирным шрифтом. Таким образом, пользователи делают это жирным шрифтом - теперь текст, который он ищет, это:

<strong><font color="#ff6600">colortext&reg;</font></strong>

Очевидно, я не собираюсь его искать. Кроме того, есть вопрос о пробелах: в одном месте есть пробел, в другом - нет.

Есть ли способ преодолеть это?

Ответы [ 4 ]

2 голосов
/ 19 февраля 2009

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

Редактировать : Под путем я подразумевал нечто похожее на XPath или понятие пути редактора TinyMCE. Пример: текстовая часть текста поиска имеет вид «colortext & reg;». Путь этого текстового узла в тексте поиска - <strong>/<font color="#ff6600">. Найдите тот же обычный текст в теле текста (тривиальный) и выберите его путь, который также равен <strong>/<font color="#ff6600">. (Сравните это с путем к «другому тексту», который равен /, и к «текстовому тексту», который равен <strong>.) Эти два пути одинаковы, так что это настоящее совпадение. Если у вас есть представление дерева DOM, определение пути не должно быть трудным.

1 голос
/ 19 февраля 2009

Вы просите о нескольких связанных, но дискретных способностях:

  • Поиск и замена контента
  • Поиск и замена форматирования
  • Поиск и замена похожих (т.е. игнорирование тривиальных различий в пробелах)

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

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

Как только у вас это работает, оно становится одним слоем в вашем стеке поисков.

Во-вторых, посмотрите поиск форматирования. Обычно это делается с помощью токенов или тегов, которые у вас уже есть в виде HTML. Тем не менее, вы должны иметь возможность иметь дело с вещами не по порядку, поэтому <b><i>text</i></b> нужно отлавливать при поиске <i><b>text</b></i> и искаженном представлении, в котором теги неправильно вложены, например, <b><i>text</b></i>. * 1020. *

Одним из способов этого является предварительный анализ строки и применение стилей форматирования к каждому символу. Таким образом, у вас будет выделено жирным шрифтом и курсивом, e жирным шрифтом и курсивом и т. Д., Чтобы сделать это проще и быстрее, используйте хэш для представления комбинации стилей - прочитайте первый символ, выясните, какой это стиль (следите за это включает и выключает стили, и вы обнаруживаете теги), и если он уже существует в хэше, присвойте этот номер хеша букве. Если этого не произойдет, получите новый хэш-номер и присвойте его.

Теперь вы можете сравнивать букву и ее хеш-стиль со своим поиском и получать совпадения по формату и содержанию. Сложите это поверх вашего аналогичного матча, и вы получите то, что вам нужно.

-Adam

1 голос
/ 19 февраля 2009

Если это действительный XML, XSLT будет тривиальным для такого рода упражнений. Используйте шаблон идентификации, а затем добавьте XPath, чтобы найти нужный узел:

<xsl:template match="//strong/font">
    <xsl:copy>
        <!-- Insert the replacement text here -->
    </xsl:copy>
</xsl:template>

При работе с XML это будет поддерживаемое, расширяемое решение.

0 голосов
/ 19 февраля 2009

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

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