php, регулярное выражение для поиска идентичных пар

прошу помощи. У меня есть текст, в котором расставлены мои собственные а-ля тег метки типа [читайте_также]тексттексттекст[/читайте_также], [прочее]тексттексттекст[/прочее] и т.д. Причем допустима вложенность. Возможно ли написать регулярку, которая "выкусывает" такие вот пары, НО с учетом СВОЕГО замыкающего тега, а не ближайшего [/]. Сложность в том, что я не хочу ЯВНО указывать перечень (читайте_также|прочее), а соорудить что то типа "заглянуть вперед, найти ближайший СВОЙ замыкающий "тег", и, расценивая УЖЕ ЭТОТ фрагмент как необходимый результат. - вырезать. Т.е. задача - заглянуть вперед и найти свою ближайшую замыкающую пару. Начал с /\[[а-я_]+\].+?\[\/[а-я_]+\]/uis но пока тупик что то UPD дада, я в курсе про обратные ссылки, но не могу осилить логику синтаксически

UPD Решение: /\[([а-я_]+)\].+?\[\/\\1\]/uis


Ответы (1 шт):

Автор решения: gil9red

Можно обернуть в группу название вашего тега и текст внутри него, и указать его в завершающем теге через \1

Пример:

$text = "[читайте_также]тексттексттекст[/читайте_также], [прочее]тексттексттекст[/прочее]";
preg_match_all('/\[([а-я_]+)\](.+?)\[\/\1\]/uis', $text, $matches, PREG_SET_ORDER);
var_dump($matches);

Результат:

array(2) {
    [0]=>
  array(3) {
        [0]=>
    string(85) "[читайте_также]тексттексттекст[/читайте_также]"
        [1]=>
    string(25) "читайте_также"
        [2]=>
    string(30) "тексттексттекст"
  }
  [1]=>
  array(3) {
        [0]=>
    string(59) "[прочее]тексттексттекст[/прочее]"
        [1]=>
    string(12) "прочее"
        [2]=>
    string(30) "тексттексттекст"
  }
}
→ Ссылка