@Virtus_pro
PHP программист

PHP 7 Как переделать из preg_replace в preg_replace_callback?

$in["#\\[index:(.+?)\\](.*?)\\[/index\\]#ies"] = "indexShow('\\1', '\\2')";
$in["#\\[modules:(.+?):(.+?)](.*?)\\[/modules]#ies"] = "modulesShow('\\1', '\\2', '\\3')";

$in["#\\[guest](.*?)\\[/guest]#ies"] =  "checkGuest('\\1')";
$in["#\\[user](.*?)\\[/user]#ies"] =  "checkUser('\\1')";
$in["#\\[title:(.*?)]#ies"] =  "\$this->preTitle('\\1');";
$in["#\\[open](.*?)\\[/open]#ies"] =  "\$this->preOpen('\\1');";
$in["#\\[userinfo:(.*?)]#ies"] =  "\$this->ustinf('\\1')";

$text = preg_replace(array_keys($in), array_values($in), $str);


Помогите пожалуйста передать из preg_replace в preg_replace_callback, уже разные варианты делал, не помогает.
  • Вопрос задан
  • 338 просмотров
Пригласить эксперта
Ответы на вопрос 1
gromdron
@gromdron
Работаю с Bitrix24
Честно говоря, без говнокода не представляю как сделать подобное.
Если уж очень топорный вариант. Первое что приходит в голову - либо класс передавать, либо глобал использовать. Глобальные переменные это как-то уж очень через чур, а вот с классом другое дело (выглядит почище, да и для глаз приятнее).

Навскидку, код, который будет отвечать за вывод будет следующим:
/* @var string Текст, в котором проводим замену*/
$str = <<<STRTEXT
[index:Звездочет]А тут хз что[/index]
Тут текст [guest]Иванов[/guest]
STRTEXT;

$oTextParser= (new TextParser($str))
				->addRule("#\\[index:(.+?)\\](.*?)\\[/index\\]#ies", "indexShow('\\1', '\\2')")
				->addRule("#\\[guest](.*?)\\[/guest]#ies","checkGuest('\\1')")
				->parse();

/*
На выходе хочу получить:
-------------------------
Звездочет(А тут хз что)
Тут текст GUEST(Иванов)
*/

echo "<pre>";
var_dump($oTextParser->getText());
echo "</pre>";

Код функций который я буду использовать:
function indexShow( $a, $b)
{
	return $a."(".$b.")";
}

function checkGuest( $a )
{
	return 'GUEST('.$a.')';	
}


Сама реализация:
class TextParser
{
	/* @var string Результат выполнения парсинга */
	public $parsed;

	/* @var string[] Ассоциативный список правил в формате: регулярка => функция для замены */
	public $rules = [];

	public function __construct( $text )
	{
		$this->parsed = $text;
	}

	/**
	 * Добавляет правило работы парсера
	 * Для использования цепочек возвращает текущий экземпляр
	 * 
	 * @param string $regex 
	 * @param string|callback $func 
	 * @return TextParser
	 */
	public function addRule( $regex, $func )
	{
		$this->rules[ $regex ] = $func;
		return $this;
	}

	/**
	 * Выполняет разброр исходного текста
	 * Для использования цепочек возвращает текущий экземпляр
	 * 
	 * @return TextParser
	 */
	public function parse()
	{
		array_walk(
			$this->rules,
			function($function, $regular)
			{
				$this->parsed = preg_replace($regular, $function, $this->parsed);
			}
		);
		return $this;
	}

	/**
	 * Возвращает результат парсера (или исходный текст, если был вызван до метода parse)
	 * 
	 * @return string
	 */
	public function getText()
	{
		return $this->parsed;
	}

}


Естественно, решение имеет свои изъяны и слабые стороны, помимо плохого кода, нельзя будет использовать функции в текущем окружении ($this).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы