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