PHP正则表达式...获得端括号的第一个实例?

时间:2011-06-30 01:56:29

标签: php regex parsing bbcode

您好我正在尝试解析一些我想出的自制bbcode并且遇到困难时间。我是regex的新手,但认为这将是一个很好的自学方式。

[%url = http://google.com] google链接[/ url%]

<a href='google.com' google link </a>

[%video = http://youtube.com?v = blah]

i will run the link through a automatic embed function 
developed in php..i just need to parse the link

[%PAGEBREAK%]

<hr>

[%img = wateva.jpg%]

<img src='wateva.jpg'>

到目前为止,我已经完成了一个效果很好的网址...见下文

$url_pattern = "/\[\s*%\s*(URL|url)\s*=\s*(.*)\](.*)\[\s*\/\s*(URL|url)\s*%\s*\]/i";
$description = preg_replace($url_pattern, "<a href='$2'>$3</a>", $description);

但是当我试图拍摄图片时......(见下文)

$img_pattern ="/\[\s*%\s*(IMG|img)=(.*)\s*(%\s*\])/i";
$description = preg_replace($img_pattern, "<img src=\'$2\' style='width: 700px; height: auto; display:block;\'>", $description);

它获取整个文本的最后一个“%]”而不是最接近的“%]”..我如何告诉它找到最接近的%]?

这是我的测试文字:

*最少100字。将您的项目描述与图像,视频和/或链接相结合..只是不要写小说!使用下面的图像部分,使用与您的文字对应的图像。说明栏中的图标将允许您添加其他媒体,如链接和视频。最少100字。将您的项目描述与图像,视频和/或链接相结合..只是不要写小说!使用下面的图像部分,使用与您的文字对应的图像。说明栏中的图标将允许您添加其他媒体,如链接和视频。最少100字。提供项目描述以及图像,视频和/或链接..

[%分页符%]

[%IMG = uploads / 06-26-11 / Cog.gif%]

只是不写小说!使用下面的图像部分,使用与您的文字对应的图像。说明栏中的图标将允许您添加其他媒体,如链接和视频。最少100字。将您的项目描述与图像,视频和/或链接相结合..只是不要写小说!使用下面的图像部分,使用与您的文字对应的图像。说明栏中的图标将允许您添加其他媒体,如链接和视频。

这是[%URL = http://google.com]链接[/ URL%]

这是一个黑帮舞蹈的视频

[%VIDEO = HTTP://www.youtube.com/watch V = lZMFwKVjV5s%] *

1 个答案:

答案 0 :(得分:2)

.*中的问题很可能是/\[\s*%\s*(IMG|img)=(.*)\s*(%\s*\])/i*贪婪 - 它会匹配文档的末尾,然后回溯到 last %]以匹配它。通常,除非您设置/s标记,导致.匹配换行符(也称为Dot-All标志),否则问题将被隐藏。
一个简单的解决方案是使用延迟量词,因此.*?默认情况下不匹配任何内容,但随后匹配越来越多的字符,直到找到第一个 %]

/\[\s*%\s*(img)=(.*?)\s*(%\s*\])/i

更好的选择是定义img标记中可接受的字母表。例如,]或换行符以外的任何内容:

/\[\s*%\s*(img)=([^\]\n\r]*)\s*(%\s*\])/i

另请参阅:Laziness Instead of Greediness

你可能也想修复其他模式,他们也有同样的问题 最后,我建议查看现有bbcode解析器的实现。这些代码可以有嵌套的结构(例如,blockquote中链接中的图像),这使得它们难以正确解析。