2013-05-27 56 views
0

我在文本[Attachment: image;upload;url]一個特殊的代碼來解析它,我需要找到所有這些標籤,我已經寫了這個正則表達式:
preg_match_all("/.*(\[Attachment: (.*);upload;(.*)\]).*/", $text, $matches);正則表達式搜索特殊的標籤

所有做工精細,它返回

Array 
(
    [0] => Array 
     (
      Text 
     ) 

    [1] => Array 
     (
      [Attachment: image;upload;url] 
     ) 

    [2] => Array 
     (
      image 
     ) 

    [3] => Array 
     (
      url 
     ) 

) 

但是,這裏有一個問題,當文本包含兩個或更多標記時,它將僅返回關於最後建立的標記的信息。

+2

我們可以有示例輸入和示例輸出嗎? – Farkie

+0

是的,數組[0]它是輸入數據 – user2058653

回答

3

你應該只匹配的標籤,而不是周圍的文字:

"/\[Attachment: ([^;]*);upload;([^\]]*)\]/" 

,而不是消極的字符集,你也可以使用.*?使用非貪婪匹配;不過,我更喜歡使用先行設置。

+0

謝謝!有用! – user2058653

0

從正則表達式的末尾刪除.*部分。使用.*,正則表達式匹配字符串的末尾,包括您想要查找的任何其他子字符串。 (或者至少所有在同一行上的 - 我不記得PHP中的默認設置是什麼。)之後,它會從字符串的末尾查找更多匹配項,但找不到任何匹配項。

+0

它不能正常工作,那麼它將返回一個不乾淨的結果,它可以包含h​​tml代碼或其他文本。 – user2058653

+0

傑克說什麼。我想道德是貪婪的所有字符匹配('。*')是一個壞主意。我最後刪除了那個,但忘記了中間的那個。 –

0

此正則表達式應該這樣做:

$正則表達式= '/附件:(。*?);(。*?);(。*?)] /';

preg_match_all($ regex,$ string,$ matches);

對我來說,這回來了你想要的(3結果);