2011-01-09 3 views
2

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

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

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

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

ответ

2

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

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

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

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

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

+0

Упрощенный, поскольку у вас есть больше указателей на фактические методы использования :). –

+0

Работая над этим, вернитесь с некоторыми результатами в ближайшее время. – Bryan

+0

Хорошо, у меня что-то работает ... 'function getTdhTitle {return id и title from query}' находится на моей странице функций. А затем '$ text = preg_replace_callback ("/\ [\ [tdh :: (. +?) \] \]/"," GetTdhTitle ", $ text);' находится на странице, которую я хочу отобразить. Работаю для меня, но ... – Bryan

1

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

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

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

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

+0

Да, это будет работать лучше :) –

+0

Я знал, что кто-то другой предложит то же самое, что и я! Во всяком случае +1, потому что ваш ответ прав, и вы придумали одно и то же решение независимо от меня. –

Смежные вопросы