我正在制作一个简单的Textile解析器,并且正在尝试为“blockquote”编写正则表达式,但是很难匹配多个新行。例如:
bq. first line of quote second line of quote third line of quote not part of the quote
它将通过preg_replace()
替换为blockquote标签,所以基本上它需要匹配"bq."
与它遇到的第一个双新行之间的所有内容。我能管理的最好的就是获得报价的第一行。感谢
答案 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);
问号标记使得它在找到第一个双重返回后添加结束块引用(“非贪婪”我相信它被调用),所以任何其他双重返回都是单独存在的(如果这不是你想要的,显然可以把它拿出来)。