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();




Пометки: php класс для замены псевдо тэгов на обычные