Довольно часто нужно дать пользователям возможность для вставки небольшого и простого сниппета (небольшого кусочка "кода") который будет заменен на более сложную или объемную конструкцию.
Php класс для замены плейсхолдеров на html вставки
06.01.2016
Приведу пример php класса для замены {sopic big="images/joomla_black.png" small="images/powered_by.png" height="60" width="60" title="Это заголовок!" } на код для вставки prettyPhoto кода.
class.pseudoTag2Tag.php (Download)
<? /* error_reporting(E_ALL); ini_set('display_errors', 'On'); */ /** * Класс для преобразованиятэгов вида: * {mytag attr1="val 1" attr2="val 2" attr2="val 3"} * в * <a attr1="val 1">val 3</a> * */ class soPseudoTag2Tag { /** * имя тэга который ищится для анализа * * @var string _sTag * */ protected $_sTag = ''; /** * Патерн * * @var string _sTag * */ protected $_sPattern = '#{mytag([^>]+)/?}#s'; /** * Конструктор * * @param string $sTag - имя тэга * */ function __construct($sTag) { $this->_sTag = $sTag; $this->_sPattern = '#{'.$this->_sTag.'([^>]+)/?}#s'; } /** * Разбераем строку, на массив атрибутов * * @param string $sAttributes - строка содержащая атрибуты * * @return array - массив атрибутов (параметров) */ protected function _getAttributes($sAttributes) { // Деление по пробелам не подойдет, т.к. пробелц могут быть внутри " " (..."val 2") $aRet = array(); /* echo $sAttributes.'<br />'; attr1="val 1" attr2="val 2" attr2="val 2" attr1="val 1" */ $sPattern = '#([0-9a-zA-Z\-]+=".*?")#s'; // echo $sPattern.'<br />'; preg_match_all($sPattern , $sAttributes, $aMatches); $aParts = array(); foreach($aMatches[0] as $sMatche) { list($key, $val) = explode('=', $sMatche); $aRet[$key] = substr($val, 1, strlen($val)-2); } /* echo '<pre>'; print_r($aRet); echo '</pre>';*/ return $aRet; } /** * Получаем значение по ключу * * @param array $sAttributes - массив атрибутов * * @return string - новый тэг */ protected function get(&$sArray, $key, $DefVal = NULL) { return isset($sArray[$key])?$sArray[$key]:$DefVal; } /** * Формируем HTML код для нового тэга * * @param array $sAttributes - массив атрибутов * * @return string - новый тэг */ protected function _makeup(&$sAttributes) { $sRet = '<a href="'.$sAttributes['attr1'].'">'.$sAttributes['attr2'].'</a>'; $sRet = htmlspecialchars($sRet); return $sRet; } /** * Формируем новый тэг * * @param array $aMatches - массив вхождений * * @return string - новый тэг */ protected function _makeTag($aMatches) { $sAttributes = $aMatches[1]; $sAttributes = $this->_getAttributes($sAttributes); return $this->_makeup($sAttributes); } /** * Основной метод, который вызывает проверку переданной строки * * @param string sText - текст в котором будет производиться поиск * * @return array - массив всех входжений */ public function parse($sText) { return preg_replace_callback($this->_sPattern, array($this, '_makeTag'), $sText); } /** * Метод для демонстрации работы * * @return NULL */ public static function demo() { $sInput = ' <p> Text, text, text...<br /> {mytag attr1="val 1" attr2="val 2" attr2="val 3"} <br /> <p> Text, text, text...<br /> {mytag attr2="val 3" attr2="val 2" attr1="val 1"} </p> </p> '; $oTagAttributesParser = new soPseudoTag2Tag('mytag'); $sResult = $oTagAttributesParser->parse($sInput); echo $sResult.'<br />'; } } // soPseudoTag2Tag::demo();