【问题标题】:PHP Regex: removing whitespace after specific patternPHP Regex:在特定模式后删除空格
【发布时间】:2013-12-13 09:51:15
【问题描述】:

下面的评论表明我的代码中存在功能错误。问题已更新以匹配。

所以我有一个正则表达式,它可以找到 bb 样式的引用并用块引用替换它们。

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

它工作得很好(它在一个while循环中获取递归引号),但后来,我使用nl2br。但是,我不想在块引用之后添加 br,所以我想在模式之后删除换行符,但我所做的一切都没有奏效。

我试过了:

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

有什么建议吗?

【问题讨论】:

  • 你的第一个(和其他)错了。需要信息:字符串是否包含多个 bb 代码?它们是嵌套的(不知道 bb 的详细信息)吗?它们是否跨越线?
  • 可以,可以包含多个代码,引号可以嵌套。他们确实跨越线。你是说第一个是错误的,但它在应用程序中完美运行?
  • 需要嵌套双引号的例子。即"asdf'asdf" 没问题,"this is " quote" 可能有问题。
  • 当我说嵌套引号时,我指的是嵌套引号标签,而不是嵌套引号标点符号。我很困惑为什么引用标点符号很重要,除了在开头的引用 bb 标记内?
  • 好的,所以嵌套了 bb Quote 标签。需要递归正则表达式。正则表达式中的 .* 将找到从第一个开引号到最后一个闭引号的所有内容。如果它对你有用,那是侥幸。

标签: php regex bbcode


【解决方案1】:

尝试使用像这样的工具,为我创造了奇迹:)

http://gskinner.com/RegExr/

【讨论】:

  • 这似乎更像是一个评论而不是一个答案。
  • 哦...它不会让我在上面发表评论,只是想分享一下正则表达式对我有什么帮助:/
  • @runelynx 您需要 50 声望才能评论其他人的答案/问题。你只需要一个更多投票的答案就可以到达那里。
  • 我用过很多工具;正如你所看到的,我有一些我尝试过的例子。我似乎无法弄清楚正确的正则表达式是什么。有些东西在这样的测试工具中工作,但在我的实际代码中没有。
【解决方案2】:

试试这个。不要使用 /../sm 任何修饰符(s 包含在正则表达式中)
编辑 - 添加尾随空格表达式

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


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

【讨论】:

  • 抱歉,我不知道开头的 (?s) 应该做什么?这适用于正则表达式测试器,但当我将其插入 PHP 时则不行。
  • @RhoVisions - 此构造 (?letters) 称为修饰符组。 /../here 这里的大多数选项都是可用的修饰符,可以内联插入到正则表达式中。我添加了(?s) ,因为我的正则表达式中的( .*? ) 子表达式需要'Dot-All' 修饰符。由于任何地方都没有 ^$ 锚点,因此也不需要 /../m 修饰符。因此,这种形式 /../none 不需要修饰符。听起来您在 PHP 代码中不是正确的 quoting。试试这个"/(?s)\\[quote(?:=\"(.*?)\")?\\](.*?)\\[\\/quote\\][^\\S\\r\\n]*[\\r\\n]*/"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 2018-12-17
  • 2020-09-01
  • 1970-01-01
相关资源
最近更新 更多