【问题标题】:Split string into bbcode sections. PHP [duplicate]将字符串拆分为 bbcode 部分。 PHP [重复]
【发布时间】:2019-06-13 16:09:08
【问题描述】:

我有一个 BBcode 所见即所得编辑器,仅用于基本样式粗体、斜体和下划线。我需要从中获取存储的数据并使用它来将其转换为 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 修复,但它不支持嵌套括号。

【问题讨论】:

  • 什么决定了分裂?
  • 如果你能把字符串描述成文字,你可以很容易地想出一个正则表达式。如果您完全不熟悉它,那么它通常不是最佳选择。这似乎是你真正想要完成的任何不切实际的中间步骤。
  • 嵌套标签呢?例如:This is some text that [i]contains Italic and [b]bold[/b] text[/i]
  • @Toto 是的,你说得对,我没有考虑过,但确实需要,努力思考一个实用的方法来解决这个问题。
  • @Wiktor 你也打算锤stackoverflow.com/q/60126022/2943403

标签: php regex phpword


【解决方案1】:

这个表达式可能会返回我们希望输出的内容,可能会稍作修改,如果不是:

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

测试

$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);

Demo

正则表达式电路

jex.im 可视化正则表达式:

【讨论】:

  • 感谢您的回答,到目前为止最好,嵌套标签呢?
  • @Emma 其他用户正在盲目地复制粘贴您的正则表达式。请收紧您的脚本,以便人们使用正确的编码实践。 stackoverflow.com/questions/60126022/…请用简单的英语解释你的模式在做什么以及为什么它是合适/可取的。
  • 更好:添加注释以仅将此解决方案视为不应在生产中使用的学术练习。现在,这篇文章只会伤害 SO 让用户相信他们可以像这样使用 z 单正则表达式解析 bbcode。有专门的库来解析 bbcode。
  • 如果模式中没有^$ 元字符,m 模式修饰符对模式没有影响。也许您的意思是使用s
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 2019-07-25
相关资源
最近更新 更多