正则表达式匹配一个文本块直到第一个双新行?

时间:2010-02-08 14:29:22

标签: php regex textile

我正在制作一个简单的Textile解析器,并且正在尝试为“blockquote”编写正则表达式,但是很难匹配多个新行。例如:

bq. first line of quote
second line of quote
third line of quote

not part of the quote

它将通过preg_replace()替换为blockquote标签,所以基本上它需要匹配"bq."与它遇到的第一个双新行之间的所有内容。我能管理的最好的就是获得报价的第一行。感谢

5 个答案:

答案 0 :(得分:6)

试试这个正则表达式:

(?s)bq\.((?!(\r?\n){2}).)*+

含义:

(?s)           # enable dot-all option
b              # match the character 'b'
q              # match the character 'q'
\.             # match the character '.'
(              # start capture group 1
  (?!          #   start negative look ahead
    (          #     start capture group 2
      \r?      #       match the character '\r' and match it once or none at all
      \n       #       match the character '\n'
    ){2}       #     end capture group 2 and repeat it exactly 2 times
  )            #   end negative look ahead
  .            #   match any character
)*+            # end capture group 1 and repeat it zero or more times, possessively

\r?\n匹配Windows,* nix和(较新的)MacOS换行符。如果您需要考虑真正的旧Mac计算机,请为其添加单个\r\r?\n|\r

答案 1 :(得分:1)

这个接受的答案只为我捕获了该块的最后一个字符。我最终使用了这个:

$text =~ /(?s)bq\.(.+?)\n\n/g

答案 2 :(得分:0)

这会有用吗?

'/(.+)\n\n/s'

我相信''代表单行。

答案 3 :(得分:0)

我的直觉告诉我类似......

preg_match("/^bq\. (.+?)\n\n/s", $input, $matches)

就像上面的家伙说的那样,在RegEx末尾的s之后的/标志意味着.将匹配换行符。通常,如果没有这个,RegExs就是一种单行的东西。

然后?后面的问号.+表示非贪婪的匹配,以便.+尽可能不匹配;相反,它将匹配最小可能值,以便\n\n匹配第一个可用的双线。

您计划在多大程度上支持纺织品的功能?因为您的RegEx会变得非常复杂,因为Textile允许像......这样的东西。

bq.. This is a block quote

This is still a block quote

...或

bq(funky). This is a block quote belonging to the class funky!

bq{color:red;}. Block quote with red text!

所有这些都是你的正则表达式替换技术无法处理的问题。

答案 4 :(得分:0)

编辑:Ehr,误读了这个问题......“bq。”很重要。

echo preg_replace('/^bq\.(.+?)\n\n/s', '<blockquote>$1</blockquote>', $str, 1);

有时,通过网络表单输入的数据包含\ r \ n而不仅仅是\ n,这将使其成为

echo preg_replace('/^bq\.(.+?)\r\n\r\n/s', '<blockquote>$1</blockquote>', $str, 1);

问号标记使得它在找到第一个双重返回后添加结束块引用(“非贪婪”我相信它被调用),所以任何其他双重返回都是单独存在的(如果这不是你想要的,显然可以把它拿出来)。