Regex для сопоставления содержимого между bbcode-подобными тегами - PullRequest
2 голосов
/ 18 апреля 2020

Я работаю над пользовательской реализацией bbcodes (в основном шорткодов Wordpress). Для этого мне нужно сопоставить содержимое, которое можно найти между двумя bbcode-подобными тегами.

Например:

[example]The content I want to retrieve[/example]

Проблема состоит в том, что эти теги в основном могут быть любыми. На этот раз это может быть пример, но вполне может быть что-то вроде этого:

[hello_world with="attribute"]And some [more-complex] content[/hello_world]

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

(?<=\[.*\])(.*?)(?=\[.*\])

Но при использовании в следующем коде:

<?php
$tag = '[test_tag with="attributes"]Content I [want] To capture[/test_tag]';

// Get the content of the shortcode.
preg_match('~(?<=\[.*\])(.*?)(?=\[.*\])~', $tag, $shortcodeContent);
var_dump($shortcodeContent);

Я получаю следующую ошибку :

Warning: preg_match(): Compilation failed: lookbehind assertion is not fixed length at offset 10 

Есть ли простой способ исправить эту ошибку? Я понимаю, что это происходит потому, что я использую шаблон «захватить все» с неопределенной длиной. Но я немного озадачен тем, как я могу это исправить. (Я на самом деле не волшебник регулярных выражений)

1 Ответ

2 голосов
/ 18 апреля 2020

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

<?php

$re = '/(?<=\])(.*?)(?=\[\/)/m';
$str = '[test_tag with="attributes"]Content I [want] To capture[/test_tag]';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
echo $matches[0][0];
?>

РАБОЧАЯ ДЕМО: https://3v4l.org/qgcNg

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