@Xveeder

Как написать парсер шорткодов на ванильном PHP?

Господа, сабж. Быть может есть ссылки с туториалами, о том, как это правильно делать (полагаю, единственное решение - регулярки, но всё-же).

Допустим, прописываем в текст шорткод [code paramOne="1" paramTwo="2"], ну и соответственно при открытии страницы с таким шорткодом в тексте, этот шорткод должен заменяться на результат работы соответствующей функции, с передачей значений и ключей параметров в функцию.

В гугле туториалы по богомерзкому WP, а как сделать это на чистом PHP - ноль результатов.
Спасибо.
  • Вопрос задан
  • 491 просмотр
Решения вопроса 1
serginhold
@serginhold
Это исходники wp, ничего умного, одни регулярки
https://github.com/WordPress/WordPress/blob/master...

---

Но можно сделать через обычные html теги, и пройтись пройстейшим встроенным классом для парсинга html

<link rel="my-shortcode" name="my-name" param1="value">

вместо
[my-shortcode name="my-name" param1="value" /]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
leha_gorbunov
@leha_gorbunov
Программист
метки в тексте статьи вида {id метки}{/id метки} . Параметры внутри этих тэгов неограниченное количество,
разделены вертикальной чертой. Пример:
{Market_place}searchText=Смартфон|searchPhrase=Купить Смартфон Xiaomi{/Market_place}


параметры в тексте рекламного скрипта в двойных квадратных скобках например [[searchText]].
Особый параметр [__counter] На случай если будет несколько одинаковых шорт кодов, то вместо [__counter] подставится его порядковый номер в тексте 0,1,2 ...

.createWidget({
	"containerId": "marketWidget[__counter]",
	"type": "offers",
	"params": {
		"searchText": "[[searchText]]",
   "searchPhrase": "[[searchPhrase]]",
		"themeId": 2
	}
});


/* Функция берет текст публикации , 
 * собрает из нее метки рекламного скрипта с параметрами
 * Параметры подставляет в тело скрипта
 * Полученный текст скрипта подставляет на место метки в публикации
 *  $body - текст публикации
 *  $script_identificator - идентификатор скрипта
 *  $script - сам программный код рекламного скрипта 
 * */
	protected function injectAdScript($body, $script_identificator, $script){
		// составляем строку для сбора всех меток для нашего скрипта
		$preg_str = '~{'.$script_identificator.'}([^{]*){/'.$script_identificator.'}~i';
		// собираем все метки скрипта из текста публикации в переменную $match.
		// $match[0] массив полных текстов меток. например {Market_place}SearchText=Смартфон|SearchPhrase=Купить Смартфон Xiaomi{/Market_place} 
		// $match[1] массив урезанных меток. Например SearchText=Смартфон|SearchPhrase=Купить Смартфон Xiaomi
		preg_match_all($preg_str, $body, $match);
		$search = []; // Здесь будем хранить массив полных текстов меток
		$replace = [];// Здесь будем хранить текст скрипта с подставленными значениями меток
		$counter = 0;// в некоторых скриптах необходимо проставлять его порядковый номер. Как параметр в тексте должен быть обозначен [__counter]
		foreach($match[1] as $key_match=>$str_params){
			$counter++;
			$tmparr = explode('|',$str_params);
			$mutated_str = $script;
			// в цикле заменяем все найденные параметры их значениями
			foreach($tmparr as $one_param){
				$tmp_param = explode('=',$one_param);
				$mutated_str = str_replace('[['.$tmp_param[0].']]',$tmp_param[1],$mutated_str);
			}
			
			$search[] = $match[0][$key_match];
			$replace[] = str_replace('[__counter]',$counter,$mutated_str); //сразу проставим порядковые номера 
		}
		
		// заменяем метки в тексте на преобразованные скрипты
		return str_replace($search,$replace,$body);
	}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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