Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: замена Bbcode на запрос к БД+ вывод
 
 автор: segafrompiter   (11.01.2015 в 13:11)   письмо автору
 
 

Пользователь в тексте использует BB код: [video]111[/video], где 111 - это id-видео в БД, в БД хранится код вызова плеера с соответствующим видео, т.е. <iframe>данные для видео</iframe>,
необходимо при выводе из БД текста пользователя заменить:
Пример видео находится ниже [video]111[/video]
на
Пример видео находится ниже [тут запрос к БД по id 111 и вывод html-кода из БД].

тэгов [video] может быть несколько

Понимаю, что надо действовать через preg_replace, но как не знаю :))

  Ответить  
 
 автор: Trianon   (11.01.2015 в 14:58)   письмо автору
 
   для: segafrompiter   (11.01.2015 в 13:11)
 

preg_replace_callback()

в качестве callback-функции использовать свою, которая обратится к БД, вытащит из нее код вставки и отдаст preg-механизму.

можно также применить preg_replace() с модификатором e в шаблоне, но это вариант для твердых духом кодеров, поскольку там читабельности никакой, и напороть - раз плюнуть. Хотя, наверняка можно добиться, чтобы работало чуть быстрее. :))

  Ответить  
 
 автор: segafrompiter   (11.01.2015 в 15:54)   письмо автору
 
   для: Trianon   (11.01.2015 в 14:58)
 

videos -таблица, где id_video-INT, video_videocode - TEXT, содержит html-код плеера
$message-сообщение из БД, TEXT, содержит к примеру - Заранее спасибо! Мое выступление на соревнованиях - [video id=1] [/video]


function video_replace($matches)
  {
  
  $res_select_video = mysql_query("SELECT * FROM videos where id_video=".$matches[0]."");
while ($row_select_video = mysql_fetch_array($res_select_video, MYSQL_BOTH)) 
{
$video_videocode=$row_select_video['video_videocode'];
}

       return "".$video_videocode."";    
 }

 $pattern = "#\[video id\=(.*?)\]([^\] \?]+?)\[/video\]#si";
 $str = preg_replace_callback($pattern, 'video_replace', $message);

echo($str);


не выводит ничего, ни ошибок, ни кода плеера

Получилось так-

function video_replace($matches)
  {
  
  $res_select_video = mysql_query("SELECT * FROM videos where id_video=".$matches[1]);
while ($row_select_video = mysql_fetch_array($res_select_video, MYSQL_BOTH)) 
{
$video_videocode=$row_select_video['video_videocode'];
}

       return "<br clear='all'><center>".$video_videocode."</center>";    
 }

 $pattern = "#\[video id=(.*?)\]#si";
 $str = preg_replace_callback($pattern, 'video_replace', $message);

 echo($str);

  Ответить  
 
 автор: Trianon   (11.01.2015 в 17:27)   письмо автору
 
   для: segafrompiter   (11.01.2015 в 15:54)
 

> $res_select_video = mysql_query("SELECT * FROM videos where id_video=".$matches[0]."");
> $pattern = "#\[video id\=(.*?)\]([^\] \?]+?)\[/video\]#si";
>не выводит ничего, ни ошибок, ни кода плеера

потому что по этому образцу построенный селект-запрос будет
SELECT * FROM videos where id_video=[video id=1] [/video]

Было бы удивительно, если б он что-то вернул.
Вообще-то результат исполнения запроса проверять стоит перед тем как далее использовать.

>Получилось так-
Эдак вы инъекций себе натолкаете полное лукошко.


Вы вроде попроще конструкцию изначально затевали? Такую?
<? //  \[video\]([0-9]+)\[/video\]
$pattern "#\\[video\\]([0-9]+)\\[/video\\]#i"


В любом случае $matches[1] стоит гасить от разного рода sql-inъекций int-ом хотя бы.
<?  
mysql_query
("SELECT * FROM videos WHERE id_video=".int($matches[1]) );

  Ответить  
 
 автор: segafrompiter   (11.01.2015 в 18:40)   письмо автору
 
   для: Trianon   (11.01.2015 в 17:27)
 

Спасибо за совет :) Но пока это внутреннее тестовое :) Снаружи будет все 2 раза перепроверяться :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования