Поиск открытого и закрывающего тега в регулярном выражении - PullRequest
0 голосов
/ 17 мая 2010

Есть ли способ найти пользовательские теги в регулярном выражении, т. Е. совпадение

{a}sometext{/a}  

а также

{c=#fff}sometext{/c}  

Так что он находит весь блок внутреннего содержимого? Проблема в том, что sometext может иметь другой тег, как в:

{a=http://www.google.com}{b}Hello, world{/b}{/a}  

Единственные решения, которые я могу придумать, совпадают с {a ... to ... / b}, когда я хочу {a ... to ... / a}, есть ли единственное решение регулярного выражения или Будет ли лучше сопоставить начало, а затем использовать другой метод, чтобы найти конец из резервной копии и извлечь его таким образом? Я использую PHP 5.2, поэтому у меня есть все варианты, которые влечет за собой.

Ответы [ 2 ]

2 голосов
/ 17 мая 2010

Это работает:

$subject = 'bla bla{a=http://www.google.com}{b}Hello, world{/b}{/a} bla';
$regex = '~\\{a(?:=[^}]+)?\\}(.*?)\\{/a\\}~';
preg_match($regex, $subject, $matches);
var_dump($matches);

дает:

array(2) {
  [0]=>
  string(48) "{a=http://www.google.com}{b}Hello, world{/b}{/a}"
  [1]=>
  string(19) "{b}Hello, world{/b}"
}

НАЧАТЬ РЕДАКТИРОВАТЬ Вы можете сделать регулярное выражение более общим с обратными ссылками

$regex = '~\\{([a-z]+)(?:=[^}]+)?\\}(.*?)\\{/\\1\\}~';

но в этом случае я понятия не имею, как сопоставить внутренние теги произвольной глубины. КОНЕЦ РЕДАКТИРОВАНИЯ

Однако я настоятельно рекомендовал не использовать регулярное выражение для этой цели. Я предлагаю вам перебирать строку по одному массиву за раз и использовать вспомогательный стек для отслеживания найденных тегов (используйте array_push , array_pop и end для просмотра).

1 голос
/ 17 мая 2010

Похоже, вы пытаетесь сделать то, что MediaWiki уже делает с языком разметки вики. Я бы посоветовал использовать их парсер и разметку, или, если вы решите свернуть свой собственный, вас может вдохновить то, как они это делают.

Руководство для Parser.php

Источник для Parser.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...