PHP正则表达式:在特定模式后删除空格

3

下面的评论向我展示了代码中存在一个功能性错误。问题已经更新以匹配。

因此,我有一个正则表达式,可以找到bb风格的引用,并将它们替换为blockquote。

$text = preg_replace("/\[quote(?:=\"(\w+?)\")?]/", '<blockquote class="quote"><div class="quotee">\1 says:</div>', $text);
$text = preg_replace("/\[\/quote\]/m", '</blockquote>', $text);

它在 while 循环中能够正常工作(以获得递归引用),但随后我使用了 nl2br。然而,我不想在 blockquote 后面添加换行符,因此我想要移除模式后面的换行符,但我尝试过的一切都没有起作用。

我尝试过:

/\[\/quote\][\r\n]?/ms
/\[\/quote\][\r\n]*/ms
/\[\/quote\][\r\n]{0,2}/ms
/\[\/quote\](?:[\r\n]|\r\n)?/ms

有什么建议吗?


是的,它可以包含多个代码,并且引号可以嵌套。它们可以跨越多行。你说第一个是错误的,但在应用程序中它完美地工作了? - Rohit
当我说嵌套引号时,我指的是嵌套的引号标签,而不是嵌套的引号标点符号。我不明白为什么引号标点符号很重要,除了在开头引号bb标签内部? - Rohit
好的,所以嵌套的bb引用标签。需要递归正则表达式。你的正则表达式中的.*将找到从第一个开放引号到最后一个闭合引号的所有内容。如果它对你起作用,那只是偶然。 - user557597
我可以制作这样的正则表达式,但没有源示例,我无法测试它。如果您的代码有效,请尝试在其末尾添加 [^\S\r\n]*[\r\n]* - user557597
啊,我发现一个不起作用的情况;同一篇文章上有两个引号。我不确定这是否是您的意思,但我已经修复了代码并更新了问题以匹配。 - Rohit
显示剩余5条评论
2个回答

1
尝试这个。 不要使用 /../sm 任何修饰符(s已包含在正则表达式中)
编辑 - 添加结尾空格表达式
 #  '/(?s)\[quote(?:="(.*?)")?\](.*?)\[\/quote\][^\S\r\n]*[\r\n]*/'


 (?s)
 \[quote
 (?:
      =
      "
      ( .*? )        # (1)
      "
 )?
 \]
 ( .*? )             # (2)
 \[\/quote\]
 [^\S\r\n]* 
 [\r\n]* 

抱歉,我不确定开头的(?s)应该做什么?这在正则表达式测试器上可以工作,但是当我将其插入PHP时却无法工作。 - Rohit
@RhoVisions - 这个构造 (?letters) 被称为修饰符组。这里的大多数选项 /../here 都是可内联插入正则表达式的修饰符。我添加了 (?s),因为在我的正则表达式中 ( .*? ) 子表达式需要 'Dot-All' 修饰符。由于没有任何 ^$ 锚点,所以也不需要 /../m 修饰符。因此,在这种形式 /../none 中不需要修饰符。听起来你在 PHP 代码中没有正确使用引号。尝试这个 "/(?s)\\[quote(?:=\"(.*?)\")?\\](.*?)\\[\\/quote\\][^\\S\\r\\n]*[\\r\\n]*/" - user557597

1

2
这似乎更像是一条评论而不是一个答案。 - Barmar
哦...它不让我在上面评论,只是想分享一下正则表达式对我有帮助的东西 :/ - runelynx
1
@runelynx 你需要50点声望才能评论其他人的答案/问题。你只需要再获得一个赞同的答案就可以达到这个要求了。 - zsaat14
我使用了许多工具;正如你所看到的,我有一些我尝试过的例子。我似乎无法弄清楚正确的正则表达式是什么。一些东西在测试工具中可以工作,但在我的实际代码中却不能。 - Rohit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接