2010-11-12 167 views
0

最近,我在玩phpBB3中的BBCode相关的东西。当我追溯我的数据库,帖子表和随机帖子。我发现图像标签是这样写的[img:fcjsgy5j]。在每个帖子的[img:...]之间会生成8个随机字符。在PHP中需要REGEX帮助。一个简单的。帮帮我!

[img:fcjsgy5j]http://imageurl.jpg[/img] 

我的问题是,如何才能让使用的preg_replace()来代替随机字符到这样的..

<img src="http://imageurl.jpg"> 
+0

[你不能解析与正则表达式BB代码(HTTP://科雷-nordmann.de/blog/do_NOT_parse_using_regexp.html)。使用[BBCode Parser](http://de2.php.net/manual/en/book.bbcode.php)。 – Gordon 2010-11-12 08:04:53

回答

4
$output = preg_replace("`\[img:.+?\](.*?)\[/img\]`i", '<img src="$1"/>', $input); 
  • [开头的字符集。我们不希望那样;我们要字面[字符匹配,所以我们有一个\
  • .逃脱它匹配任何字符
  • +意味着我们匹配1个或多个以前的事情(任何字符)
  • ?使得以前量词ungreedy(.+会匹配一切,对字符串的尽头,那不是我们想要的,我们希望它匹配尽可能少的...只是到下一个]
  • (.*?)匹配之间的所有垃圾[img]标签。再次公布。我们把()放在它的周围,使它成为一组
  • 在开始和结束时的'(back-tick)可以是任何字符......无论你开始的任何字符,你必须结束。很多人使用/,但我更喜欢back-tick,因为它很少出现在正则表达式的任何位置,因此我不需要转义它。
  • 最后的i表示表达式将不区分大小写。 (将匹配IMG,IMG,IMG等)
  • $1的替代是指回()部分我们前面记...它基本上采用任何被匹配那里,它扑通一声入$1
  • 的地方
+1

[a-z]将会错过5,最好使用简单的。+ – generalhenry 2010-11-12 07:09:01

+0

@generalhenry:'。+?'你的意思是......否则它很贪婪,会吞噬一切。 – mpen 2010-11-12 07:12:02

+1

我一直认为你必须在PHP正则表达式中使用分隔符。这段代码是否真的在运行?我没有安装PHP,所以我无法检查。 – 2010-11-12 07:16:15

0

试试这个代码:

<?php 
$search = array(
    '\[img:.+?\](.*?)\[\/img\]\' 
); 
$replace = array(
    '<img src="\\2">' 
); 
$result = preg_replace($search, $replace, $string); 
} 
?> 

我用preg_replace函数的阵列形式,好让你可以添加更多的搜索和未来的替代模式。我想你正在尝试替换一些BBCODE标签。网上有很多库可以正确处理BBCODE。

编辑

赞一个: http://php.net/manual/en/book.bbcode.php

+0

你的'$ search'永远不会匹配..你没有处理随机字符。还有,你回来了......从什么?这不是一个函数AFAIK。 – mpen 2010-11-12 07:13:07

2
$result = preg_replace('%\[img:[^]]+\]([^[]+)\[/img\]%', '<img src="\1">', $subject); 

,或作为评论的正则表达式:

$result = preg_replace(
    '%\[img: # match [img: 
    [^]]+  # match one or more non-] characters 
    \]  # match ] 
    ([^[]+) # match one or more non-[ characters 
    \[/img\] # match [/img] 
    %x', 
    '<img src="\1">', $subject);