Вы просите о нескольких связанных, но дискретных способностях:
- Поиск и замена контента
- Поиск и замена форматирования
- Поиск и замена похожих (т.е. игнорирование тривиальных различий в пробелах)
Вы должны предпринять это поэтапно - в противном случае это станет перегруженным, и один алгоритм поиска не сможет выполнить все три без особых усилий, что приведет к затруднению сопровождения кода.
Сначала посмотрите на похожую проблему. Сделайте поиск, который игнорирует пробелы и регистр. Возможно, вы захотите перейти на Lucene или другую технологию поисковой системы, если вам также придется иметь дело с «чашей» и «чашами» и «умными» и «умными» - хотя я ожидаю, что это выходит за рамки ваших текущих потребностей.
Как только у вас это работает, оно становится одним слоем в вашем стеке поисков.
Во-вторых, посмотрите поиск форматирования. Обычно это делается с помощью токенов или тегов, которые у вас уже есть в виде HTML. Тем не менее, вы должны иметь возможность иметь дело с вещами не по порядку, поэтому <b><i>text</i></b>
нужно отлавливать при поиске <i><b>text</b></i>
и искаженном представлении, в котором теги неправильно вложены, например, <b><i>text</b></i>
. * 1020. *
Одним из способов этого является предварительный анализ строки и применение стилей форматирования к каждому символу. Таким образом, у вас будет выделено жирным шрифтом и курсивом, e жирным шрифтом и курсивом и т. Д., Чтобы сделать это проще и быстрее, используйте хэш для представления комбинации стилей - прочитайте первый символ, выясните, какой это стиль (следите за это включает и выключает стили, и вы обнаруживаете теги), и если он уже существует в хэше, присвойте этот номер хеша букве. Если этого не произойдет, получите новый хэш-номер и присвойте его.
Теперь вы можете сравнивать букву и ее хеш-стиль со своим поиском и получать совпадения по формату и содержанию. Сложите это поверх вашего аналогичного матча, и вы получите то, что вам нужно.
-Adam