Разделить строку на разделы bbcode. PHP - PullRequest
1 голос
/ 13 июня 2019

У меня есть редактор BBcode wysiwyg только для базовых стилей, выделенных жирным шрифтом, курсивом и подчеркиванием.Мне нужно взять из него сохраненные данные и использовать их для преобразования их в дружественный к PHPWord массив.

PHPWord работает с чем-то, называемым textrun, поэтому, чтобы в строке было много стилей, вы бы просто сделали что-то вроде ...

$PHPWordTextRun = new TextRun();
$PHPWordTextRun->addText('This is some text that contains ', 'NORMAL');
$PHPWordTextRun->addText('Italic ', 'ITALIC');
$PHPWordTextRun->addText(' and ', 'NORMAL');
$PHPWordTextRun->addText('bold', 'BOLD');
$PHPWordTextRun->addText('text', 'NORMAL');

Я все еще не совсем уверен в том, как я делаю вложенные теги.

Так что в любом случае мне нужна помощь.Превращаем эту строку ниже ...

$string = "This is some text that contains [i]Italic[/i] and [b]bold[/b] text"

и превращаем ее в массив, подобный этому

Array("This is some text that contains ","[i]Italic[/i]","and ","[b]bold[/b]","text");

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

Моя конечная цель - получить что-то вроде ...

$PHPWordTextRun = new TextRun();
foreach($array as $line) {
    $PHPWordTextRun->addText($line['text'], $line['style']);
}

ОБНОВЛЕНИЕ:

Так что после тестирования и игры с парой ответов, которые у меня естьпридумайте следующее.

Как предложено ниже, я попробовал следующее.

$array = preg_split('/(.*?)(\[.+?\].+?\[\/.+?\])(.*?)|(.*)/m', $txt, 0, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

Это работает до некоторой степени, но у нее было много пробелов, но исправлено с помощью PREG_SPLIT_NO_EMPTY, но это не такподдержка вложенных скобок.

1 Ответ

0 голосов
/ 13 июня 2019

Это выражение может, скорее всего, вернуть то, что мы хотим вывести, возможно, с небольшими изменениями, если нет:

(.*?)(\[.+?\].+?\[\/.+?\])(.*?)|(.*)

Test

$re = '/(.*?)(\[.+?\].+?\[\/.+?\])(.*?)|(.*)/m';
$str = 'This is some text that contains [i]Italic[/i] and [b]bold[/b] text This is some text that contains [i]Italic[/i] and [b]bold[/b] text This is some text that contains [i]Italic[/i] and [b]bold[/b] text';

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

// Print the entire match result
var_dump($matches);

Демо

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

...