Как создать функцию в стиле шорткода Wordpress на PHP
Я пытаюсь создать функцию в стиле шорткодов Wordpress на PHP, чтобы заменить короткие коды, такие как "[[133]]", изображениями. В принципе, у меня есть таблица MySQL URL-адресов изображений/заголовков/субтитров с идентификаторами 1-150, и я хочу иметь возможность динамически вставлять их в текст моих страниц с помощью коротких кодов, таких как:
Бла-бла-бла-бла-бла. [[5]] Кроме того, бла-бла-бла-бла-бла [[27]] Эй, и бла-бла-бла! [[129]]
Итак, я просто хочу захватить идентификатор как $id, а затем передать его Запрос MySQL, такой как mysql_query ("ВЫБЕРИТЕ заголовок, подзаголовок, URL-адрес ИЗ изображений, ГДЕ id = $id") а затем замените "[[идентификатор]]" на img/заголовок/подзаголовок. Я хотел бы иметь возможность делать это несколько раз на одной странице.
Я знаю, что это должно включать регулярное выражение и некоторую комбинацию preg_match, preg_replace, strstr, strpos, substr... но я не знаю, с чего начать и какие функции я должен использовать для выполнения каких задач. Можете ли вы порекомендовать стратегию? Мне не нужен сам код - просто знание что использовать для каких деталей было бы чрезвычайно полезно.
5 answers
Если вы хотите иметь возможность писать короткие коды следующим образом:
[[function_name_suffix parameter1 parameter2 ...]]
Вот более полный способ, использующий preg_replace_callback
и call_user_func_array
для реализации параметризованных коротких кодов.
function shortcodify($string){
return preg_replace_callback('#\[\[(.*?)\]\]#', function ($matches) {
$whitespace_explode = explode(" ", $matches[1]);
$fnName = 'shortcode_'.array_shift($whitespace_explode);
return function_exists($fnName) ? call_user_func_array($fnName,$whitespace_explode) : $matches[0];
}, $string);
}
Если эта функция определена:
function shortcode_name($firstname="",$lastname=""){
return "<span class='firstname'>".$firstname."</span> <span class='lastname'>".$lastname."</span>";
}
Тогда этот вызов
print shortcodify("My name is [[name armel larcier]]");
Выведет:
My name is <span class='firstname'>armel</span> <span class='lastname'>larcier</span>
Это просто то, что я реализовал прямо сейчас, основываясь на идее supertrue.
Любая обратная связь более чем приветствуется.
С функцией getimage($id)
, которая выполняет запрос MySQL и форматирует текст замены, это почти делает все, что вам нужно:
$text = "Blabla [[5]] and [[111]] bla bla bla [[27]] and bla bla bla! [[129]]";
$zpreg = preg_match_all('#\[\[(\d{1,3})\]\]#', $text, $matches );
var_dump( $matches[1] );
$newtext = preg_replace('#\[\[(\d{1,3})\]\]#', getimage($matches[1][?????]), $text);
echo $newtext;
Мне просто нужно выяснить, что поместить внутрь getimage()
(где????? есть), что заставит его поместить правильный образ для правильного [[id]]
.
См. preg_match_all
и preg_replace
более подробную информацию можно найти в официальной документации.
Для этого могут быть использованы различные подходы, в зависимости от того, как вы планируете отображать ect,
Возьмите предложение "Привет, [34] мир"
Создайте простую функцию, например, замените код($string)
function replaceCode($string){
$pos = strpos($string, '['); // Find the first occurrence of the bracket
if($pos != false){
// If everything is ok take the next 2 numbers from it
// Check for a close bracket & remove ]
// call another function to replace the number with the image text
}
}
Если найдены другие вхождения скобок, рекурсивно вызовите функцию снова, снова передав оставшуюся часть строки функции.
Примечание: Сначала может потребоваться проверка, чтобы убедиться, что [и] правильно сбалансированы!
Моя ставка - Функция strtr PHP...
<?php
function get_profile_image($image_url){
return "<img src='{$image_url}' height='200px' width='200px' />";
}
$trans = array(
"[[1]]" => "Vishal",
"[[2]]" => "Kumar",
"[[3]]" => "Sahu",
"[[4]]" => "Web Designer",
"[[5]]" => "Draw and Paint",
"[[6]]" => ucwords("any programming language"),
"[[7]]" => strtoupper("PHP, JAVASCRIPT and HTML"),
"[[8]]" => get_profile_image("http://php.net/images/logos/php-logo.svg"),
"[[9]]" => "http://php.net/images/logos/php-logo.svg"
);
$str = <<<HEREDOC_1
[[8]]
<pre>My name is [[1]] [[2]] [[3]].
I am a [[4]] and I love to [[5]].
I don't know [[6]] but I know [[7]] little bit.</pre>
Here is my profile image <img src='[[9]]' alt='[[1]]-[[2]]-[[3]]-[[4]]' />
HEREDOC_1;
echo strtr($str, $trans);
Его вывод равен
[http://php.net/images/logos/php-logo.svg ] Меня зовут Вишал Кумар Саху. Я веб-дизайнер и люблю Рисовать и Рисовать. Я не знаю Любой язык программирования, но я немного знаю PHP, JAVASCRIPT И HTML . Вот мое изображение профиля [Вишал-Кумар-Саху-Веб-дизайнер]
Он отлично работает на 5.6.
Регулярное выражение, я полагаю, будет следующим:
/\[\[[1-9]{1,3}\]\]/g
(для числа от 1 до 3 цифр в двойных скобках.)