@Sparkis
PHP Developer

Как сделать необязательный участок в регулярном выражение preg_replace_callback?

Есть 2 условия preg_replace_callback:
if (strpos (self::$template, "[authis]") !== false) {
		self::$template = preg_replace_callback("#\\[authis\\](.*?)\\[else\\](.*?)\\[/authis\\]#is", function($matches){
			return $matches[1];
		}, self::$template);
	}
		
	if (strpos (self::$template, "[authis]") !== false) {
		self::$template = preg_replace_callback("#\\[authis\\](.*?)\\[/authis\\]#is", function($matches){
			return $matches[1];
		}, self::$template);
	}


Эти 2 условия хорошо работают, но хотелось бы как это их объединить, если это возможно. Первая регулярка ищет конструкцию вида "[authis]Текст[else]Текст[/authis]", а вторая ищет [authis]Текст[/authis].

Вопрос следующий. Как заставить искать обе конструкции за раз. То есть в первой конструкции должен игнорироваться участок "\\[else\\](.*?)", если его нет в самой конструкции.

Если нет "[else]Текст", то игнорируется "\\[else\\](.*?)".
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
Ivanq
@Ivanq
Знаю php, js, html, css
Игнорирование - ?
Почему бы не сделать
#\\[authis\\](.*?)(\\[else\\](.*?))?\\[/authis\\]#is

Но учтите, что я добавил скобки, так что $matches[...] нужно пересмотреть.

UPD https://regex101.com/r/hd6CCL/1
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@KlassT
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы