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 класс для замены псевдо тэгов на обычные
Яндекс.Метрика