Задать вопрос
@exxagw

Как составить сложное regexp условие?

Как превратить это
<chunk>[[$chunk.name.test]]</chunk>
<chunk>[[!$tpl.test.name]]</chunk>
<chunk>[[$test]]</chunk>

в это?
<span data-element="chunk" name="chunk.name.test">[[$chunk.name.test]]</span>
<span data-element="chunk" name="tpl.test.name">[[!$tpl.test.name]]</span>
<span data-element="chunk" name="test">[[$test]]</span>
  • Вопрос задан
  • 201 просмотр
Подписаться 2 Оценить 3 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
Denormalization
@Denormalization
<?php

$str = '<chunk>[[$chunk.name.test]]</chunk><chunk>[[!$tpl.test.name]]</chunk><chunk>[[$test]]</chunk>';
$replace = '<span data-element="$1" name="$3">$2</span>';

echo preg_replace("/<(\w+)>(\[\[[$!]+([^\]]+)\]\])<\/(\w+)>/u", $replace, $str);


Вывод:
$ php replace.php
<span data-element="chunk" name="chunk.name.test">[[$chunk.name.test]]</span>
<span data-element="chunk" name="tpl.test.name">[[!$tpl.test.name]]</span>
<span data-element="chunk" name="test">[[$test]]</span>


Вариант с $allow:
<?php

$str = '<chunk>[[$chunk.name.test]]</chunk><chunk>[[!$tpl.test.name]]</chunk><chunk>[[$test]]</chunk>';
$replace = '<span data-element="$1" name="$3">$2</span>';
$allow = 'chunk.name.test|test';

echo preg_replace("/<(\w+)>(\[\[[$!]+((?:{$allow}))\]\])<\/(\w+)>/u", $replace, $str);


Вывод:
$ php replace.php
<span data-element="chunk" name="chunk.name.test">[[$chunk.name.test]]</span>
<chunk>[[!$tpl.test.name]]</chunk>
<span data-element="chunk" name="test">[[$test]]</span>


Поиграйтесь тут:
https://regex101.com/r/gI5rE3/1
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽