MySQL запрос на основе строки в preg_match или preg_replace? - PullRequest
2 голосов
/ 09 января 2011

В предыдущем вопросе мне удалось добиться замены текста в моей вики.Который прекрасно работает с названиями.Но теперь я бы хотел заменить заголовки на идентификаторы.Для моей вики я просто заменяю [[wiki :: Title]] ссылкой на этот заголовок.Как я могу получить ссылки с идентификаторов в этом месте заголовка?

Приведенный ниже код работает, но выводит только идентификатор.Пример текста включает в себя [[tdh::1]] и [[tdh::5]].Теперь я хотел бы взять этот идентификатор и запросить его в своей базе данных и использовать этот результат для построения ссылки.

$text = preg_replace("/\[\[tdh::(.+?)\]\]/","<a href=\"*page here*?task=tdhelp&action=read&id=\\1\">\\1</a>", $text);

Было бы полезно указать мне правильное направление.Благодаря.

Ответы [ 2 ]

2 голосов
/ 09 января 2011

Вы можете использовать preg_replace_callback, а для параметра callback использовать функцию, которая использует идентификатор для извлечения имени из базы данных.

Обратите внимание, что вышеуказанный подход, хотя и простой, потенциально может привести к большому количеству вызовов базы данных.Улучшение заключается в том, чтобы сначала найти все идентификаторы, используя preg_match_all, и сохранить их в массиве.Затем вы можете получить все имена за один вызов базы данных.SQL, который вам нужен, будет выглядеть примерно так:

SELECT id, name
FROM links
WHERE id IN (?, ?, ?)

Следите за уязвимостями внедрения SQL, если вы не используете параметризованные запросы.Сохраните результаты в ассоциативном массиве с идентификатором в качестве ключа и именем в качестве значения.

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

1 голос
/ 09 января 2011

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

Вы используете preg_replace_callback для фактической замены на основе этих кэшированных данных.

В качестве альтернативы вы можете выполнить двухэтапный процесс: попробуйте один раз и запишите найденный идентификатор (а не замену).Используйте их, чтобы запросить в БД дополнительные данные.Сделайте еще один поиск и замените результаты.

Вы также можете сделать то, что предложила @Mark, но если редактируемая страница имеет 15 заголовков, вы сделаете 15 запросов к БД, и это может сработать или не работать для вас.При некоторой высокой нагрузке это, вероятно, не будет работать.Это обычно означает медленные страницы.

...