Довольно часто нужно дать пользователям возможность для вставки небольшого и простого сниппета (небольшого кусочка "кода") который будет заменен на более сложную или объемную конструкцию.
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();