@Vasilisck48

Как правильно передать параметр функции php?

Всем привет, есть код который выполняет функцию bb тегов в сообщении:
function commentfile($parametr) {

 include ($_SERVER["DOCUMENT_ROOT"]."/ini/connect.php");

 $link = mysqli_connect($mysql_host, $mysql_user, $mysql_password, $mysql_database);

 if ($link == false) {

  mysqli_close($link);

  return "<p class=\"p\">
  <span style=\"display: inline-block; color: #000000!important; background-color: #e5d8ef!important; padding: 10px; border-radius: 5px; margin: 3px;\">
  <span class=\"red\">
  Нет подключения к базе данных!
  </span>
  </span>
  </p>";

 }

 $mess_db = mysqli_query($link, "SELECT * FROM bd_commentsfile WHERE id = '$parametr'");
 $db_ms = mysqli_fetch_array($mess_db);

 if (mysqli_num_rows($mess_db) == "0") {

  return "<p class=\"p\">
  <span style=\"display: inline-block; color: #000000!important; background-color: #e5d8ef!important; padding: 10px; border-radius: 5px; margin: 3px;\">
  <span class=\"red\">
  Цитируемое сообщение не найдено!
  </span>
  </span>
  </p>";

 } else {

  if ($db_ms["files"] != "0") { $files = attached_files($db_ms["files"], false); }

  return "<p class=\"p\">
  <span style=\"display: inline-block; color: #000000!important; background-color: #e5d8ef!important; padding: 10px; border-radius: 5px; margin: 3px;\">
  ".$db_ms["messages"]."
  ".$files."
  </span>
  </p>";

 }

}

function mod_text($parametr) {

 $bb_mess = array (

 "#\[b\](.+?)\[\/b\]#is",
 "#\[\[commentfile=(.+?)\]\]#is"

 );

 $bb_replace = array (

 "<b>\\1</b>",
 "".commentfile("\\1").""

 );

 return preg_replace($bb_mess, $bb_replace, $par);

}


Мне нужно чтобы по тегу [[commentfile=3]] выполнялась функция function commentfile она в свою очередь вынимает комментарий из бд и выводит в виде цитаты сообщения от пользователя НО, когда я делаю так "".commentfile("\\1")."" у меня вынимает из бд этот id 1 то-есть //1 хотя если вернуть из функции "commentfile" return $parametr; возвращает все как надо, то что между [[commentfile=?????]], не пойму что я делаю не так и что за парадокс?.
Строго не судите в программировании не особо большой опыт. Спасибо.
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
commentfile("\\1") выполняется в момент создания массива, а не при вызове preg_replace.
Чтобы применить функцию к результатам поиска, надо использовать preg_replace_callback:
function mod_text($parametr) {
  return preg_replace_callback(
    ['#\[b\](.+?)\[/b\]#is', '#\[\[commentfile=(.+?)\]\]#is'], [
      function ($val) { return '<b>' . $val[1] . '</b>'; },
      function ($val) { return commentfile($val[1]); },
    ], $parametr);
}

И кавычки должны быть именно одинарными, а не двойными. В двойных кавычка регулярки выглядят так:
"#\\[b\\](.+?)\\[/b\\]#is"
"#\\[\\[commentfile=(.+?)\\]\\]#is"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы