Как правило, вы хотите выполнять поиск ссылок как можно реже, потому что нет особенно эффективного способа сделать это. Вы не указали, какие данные есть на вашем сайте, но я предполагаю, что это что-то вроде вики или блога. Я собираюсь поговорить о такого рода функциональности, как это было бы сделано для вики, но подобный подход будет работать для всего.
В вики вы хотите выполнять поиск ссылок только тогда, когда страница изменяется (или отправляется в первую очередь). Обратите внимание, что есть два разных способа обработки ссылок. Во-первых, когда страница создается или редактируется, вам нужно выполнить поиск текста этой страницы, чтобы определить, какие ссылки должны быть на ней. Во-вторых, всякий раз, когда какая-либо страница создается, переименовывается или удаляется, вам нужно (в дополнение к поиску этой страницы в случае создания) искать все остальные страницы, чтобы добавлять / обновлять / удалять ссылки по мере необходимости. Есть несколько вариантов хранения этих ссылок.
Один из вариантов - сохранить две «версии» текста каждой страницы в базе данных. Одна версия - это оригинальная версия «разметки», это то, что вы фактически ввели, и что будет отображаться, если вы решите редактировать страницу. Вторая версия - это разобранная / обработанная «отображаемая» версия. Это данные, которые используются для отображения страницы обычным пользователям.
Например, если ваша вики-разметка для жирного шрифта **
, «версия разметки» имеет **bold text**
, а «отображаемая версия» - <strong>bold text</strong>
. Это позволяет избежать обработки разметки при каждом просмотре страницы.
Этот подход применяется к ссылкам на страницы, выполняя поиск по представленному тексту, чтобы найти слова, которые должны быть связаны, и помещая эти ссылки в «отображаемую версию». Например, при отправке страницы вам нужно пройтись по каждому слову в тексте страницы и сравнить его со списком «ссылочных слов» (убедитесь, что этот список кэширован, вы не хотите выполнять запрос к базе данных за каждое слово). Это может быть сделано довольно эффективно, сохраняя потенциальные ключевые слова в качестве ключей в хэше. Если проверяемое слово находится в списке «связующее слово», вы помещаете ссылку на соответствующую страницу вокруг слова, когда копируете его в текст «отображаемой версии». Если это не так, вы просто вводите слово в точности так, как оно было в «версии разметки».
Есть несколько других вариантов того, как это реализовать, но это довольно простой вариант. Сейчас я оставлю вас с этим, но если вы хотите, чтобы я описал какие-либо другие варианты, дайте мне знать в комментарии, и я отредактирую его.