【问题标题】:Need regex to grep quote tags需要正则表达式来 grep 引用标签
【发布时间】:2011-10-03 16:25:25
【问题描述】:

我需要修改 preg_replace 的正则表达式:

[quote](content)[/quote] 转为<blockquote>(content)</blockquote>

+

[quote=(username)][/quote] 转为<blockquote>Post user: (username)</blockquote>

+

[quote=(username);(id)][/quote] 转为<blockquote>Post user: (username).<br/>ID: (id)</blockquote>

当然,(内容),(用户名),(id)应该是正则表达式将grep的那些。 我进行了很多搜索,但没有找到任何适合此操作的正则表达式。所以,请帮帮我。

【问题讨论】:

标签: php regex replace preg-replace bbcode


【解决方案1】:

我会用 3 个单独的正则表达式来做,因为如果你试图将两个条件放在一个正则表达式中,它会变成一团糟。

preg_replace('#\[quote\](.+?)\[/quote\]#', '<blockquote>$1</blockquote>', $input);
preg_replace('#\[quote=(.+?)\]\[/quote\]#', '<blockquote>Post user: $1</blockquote>', $input);
preg_replace('#\[quote=(.+?);(.+?)\]\[/quote\]#', '<blockquote>Post user: $1.<br\>ID: $2</blockquote>', $input);

当然,这是逐字逐句回答您的问题。您似乎忘记了后两个示例中的(内容)。

编辑:如果您真的只想使用一个 preg_replace 调用,您可以创建包含这些模式和替换的数组,如第二个示例 here 所示。

编辑 2: BBCode 是否支持嵌套引用块?如果是这样,那就有点复杂了。

编辑 3: 更简单的方法。由于[/quote]总是导致&lt;/blockquote&gt;,所以你可以跳过所有这些捕获组废话,只需分别替换打开和关闭标签:

preg_replace('#\[quote\]#', '<blockquote>', $input);
preg_replace('#\[quote=(.+?)\]#', '<blockquote>Post user: $1>', $input);
preg_replace('#\[quote=(.+?);(.+?)\]#', '<blockquote>Post user: $1.<br\>ID: $2', $input);
preg_replace('#\[/quote\]#', '</blockquote>', $input);

【讨论】:

  • 请查看我的实际正则表达式:pastebin.com/L2sJWMYR ...也请看看这个! stackoverflow.com/questions/7638527/…
  • 如果你想解析嵌套的引用块,可以做到,只是更痛苦。尝试将 (.+?) 内容捕获组替换为:(.*?(?:\[quote.+?\[/quote\])*.*?)
  • 现在收到这样的警告:Warning: preg_replace(): Compilation failed: unmatched parentheses at offset 48 in /home[...] 这就是我得到的:pastebin.com/PV1zvDpu,请帮帮我。
  • 对不起,我累了。我现在换好了。它不会发出警告,但也不会带来任何好的结果 - 我看不到:(.*?(?:\[quote.+?\[/quote\])*.*?)(.*?) 之间的任何变化。我在这里解释了更多,在什么情况下它会失败等:pastebin.com/snYMXFFY。这是我的实际代码:pastebin.com/Q700vP1Q。你说我有多余的括号是什么意思?我找不到一个。也许是一点小费?因为我现在已经坚持了 2 多天了。 ://
  • 是的,我想到了一种更好的嵌套方法。由于您无论如何都在循环中运行它,所以让我们尝试添加一个否定断言组,因此它每次都会匹配最里面的引用块。试试这个内容:((?:(?![quote).)*)。这将匹配尽可能多的不包含 [quote] 标记的字符,因此对于任何不在最里面的引号块,匹配都将失败。
猜你喜欢
  • 2020-04-13
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多