2013-05-21 23 views
0

對不起球員,也許我的問題是,真的很傻,但我堅持......再次用正則表達式...我不能用我的正則表達式正確

你看,我有一個變量,例如:

$str = "[quote]Here I am 2013[/quote]"; 

$rega = preg_match_all("/[quote](.*)[quote]/i",$str,$hols); 

當我試圖讓$ hols變量,我得到的是這樣的:

報價]在這裏,我2013 [/報價

但我需要的東西是這樣的:

在這裏,我2013

第二個問題是當我嘗試從$ STR獲得:

$str = "[quote]Hello people 

this 

is 

my...[/quote]"; 

所以,我經常表達,我得到這樣的東西:

quote]Hello people 

但我需要:

Hello people 

this 

is 

my... 

我會很感激,如果你能向我解釋如何與它進行處理,如何作出正確選擇。因爲我不知道如何解決它。

回答

2

除了Frits的說法,你需要跳過括號;您目前正在要求RegEx匹配任何字符'q','u','o','t'或'e',然後是任何字符,然後是相同的字符。唯一的原因是這場比賽的規模如此之大與你的表情很貪婪有關,而Frits的建議會「打破」這一點(儘管如此)。總之,逃避括號像這樣:

/\[quote\](.*?)\[\/quote\]/mis 

更多的解釋:

考慮您的早期模式:

/[quote](.*)[quote]/i 

您所要求的:

  1. 的任何字符設置[quote]
  2. 除換行符之外的任何字符,零或m礦石倍
  3. 所述一組中的任何字符[報價]

因此,舉例來說,該字符串Queen's Charter!將匹配,如Queen's Charteueen's Chart內匹配(因爲第一和最後一個字符類不捕獲) 。

如果您使第二步非貪心,那麼您得到Qu,eete,根本沒有內在匹配。

編輯:在回答評論

我跑到下面的代碼:

preg_match_all(
    '/\[quote\](.*?)\[\/quote\]/mis', 
    "[quote]A test! A Marvelous Test![/quote]", 
    $matches 
); 

var_dump($matches); 

,得到了以下結果:

array (size=2) 
    0 => 
    array (size=1) 
     0 => string '[quote]A test! A Marvelous Test![/quote]' (length=41) 
    1 => 
    array (size=1) 
     0 => string 'A test! A Marvelous Test!' (length=26) 
+0

對不起,但你的變體是不工作,它仍然返回不喜歡:[quote]你好人這是我的... [/報價] [quote]我的意思是 – Jerome

+1

你在尋找'$ hols [0]'或'$ hols [1]'? '$ hols [0]'將包含**完整**匹配,即整個字符串; '$ hols [1]'將包含**子模式**(括號內的引號標籤之間的部分)。查看我最近的編輯以獲取更多信息。 – Dereleased

+0

yeahhh !!我的壞,真的工作,我想要的!謝謝。你是搖滾!!!)))超級! – Jerome

2
preg_match_all("/[quote](.*)[quote]/i",$str,$hols); 
          ^--- missing/there 

此外,你可能想:

"/\[quote\](.*?)\[\/quote\]/mis" 

爲了使它:ungreedy,匹配多行,你必須逃離[][quote]實際上定義了一個字符類匹配剛剛Q,ū ,o,t和e

如果您還可以嵌套[quote] s,則必須離開使用正則表達式,因爲嵌套不是上下文無關的。正則表達式只能處理上下文無關語法。那麼解決方案就是構建一個(非常簡單)的解析器。

+0

+1解析器;從不嵌套正則表達式。如果你認爲你可以,你不能。這樣,瘋狂的謊言。 – Dereleased