2010-11-12 163 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);