RegEx: считать символы - PullRequest
       11

RegEx: считать символы

1 голос
/ 08 августа 2011

Я пишу PHP-скрипт, который ищет определенные заголовки внутри документа dokuWiki.

Мой текущий шаблон выглядит так:

$pattern = "/.*=+ ". $header ." =+([^=]+)/m";
preg_match($pattern, $art->text, $m);
if (!empty($m[1])) {
   $art->text = $m[1];
} else {
   $art->text = "";
}

Пример документа:

====== TestHeader ======
Testtext

===== Header2 =====
Testtext2

==== Header3 ====
Testtext3

====== Header4 ======
Testtext4

При поиске TestHeader мой результат AS-IS следующий:

====== TestHeader ======
Testtext

Я бы хотел, чтобы шаблон возвращал:

====== TestHeader ======
Testtext

===== Header2 =====
Testtext2

==== Header3 ====
Testtext3

Или другими словами: Iхотел бы сопоставить все заголовки, которые окружены меньше = тогда заголовок, который я искал.

Возможно ли что-то подобное с регулярными выражениями?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 08 августа 2011

Поскольку я не очень хороший PHP-кодер, я не знаю, существуют ли какие-либо специальные расширения PHP для «обычных» регулярных выражений, которые позволяют вам то, что вы хотите. Кроме того, регулярные выражения не могут решить вашу проблему.

За этим стоит некоторая теория информации, если вам интересно: регулярные выражения могут анализировать только так называемые "обычные языки" (см. Соответствующую статью Википедии ). Не слишком углубляясь в теорию, я могу дать вам понять, что регулярные выражения не могут «сосчитать» вещи (по крайней мере, в том смысле, что они могут сравнивать два числа в совпадении). Чтобы переформулировать пример WP: вы не можете найти строку, в которой есть N a, за которыми следуют N b, независимо от того, что N.

Конечно, это не математическое доказательство того, что то, что вы ищете, невозможно, но оно должно дать вам представление о том, что регулярные выражения могут и не могут делать. НТН

1 голос
/ 08 августа 2011

Вы можете сделать это за пару шагов:

  • Используйте код, который вам нужен, чтобы найти искомый заголовок.
  • Подсчитайте = в этом заголовке.
  • Поиск всех заголовков с таким большим или меньшим числом = 100 *

Предположим, вы знали, что искали $ n или меньше символов = в заголовке:

$pattern = "/.*={1,$n} ". $header ." ={1,$n}([^=]+)/m";

Хотя вам нужно использовать два регулярных выражения и выполнить небольшую обработку, оно должно быть довольно быстрым, и второе регулярное выражение выполнит именно то, что вы просите.

...