正则表达式搜索特殊标记

时间:2013-05-27 15:27:31

标签: php regex preg-match-all

我在文本[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
        )

)

但是这里有一个问题,当文本包含两个或更多标签时,它只返回有关最后建立标签的信息。

3 个答案:

答案 0 :(得分:3)

您应该只匹配标签,而不是周围的文字:

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

您也可以使用.*?来使用非贪婪匹配,而不是使用否定字符集;但是,我更喜欢使用前瞻设置。

答案 1 :(得分:0)

从正则表达式的末尾删除.*部分。使用.*,正则表达式匹配字符串的结尾,包括您要查找的任何其他子字符串。 (或者至少是同一行上的所有内容 - 我不记得PHP中的默认设置。)之后它会从字符串的末尾查找更多匹配项,但找不到任何匹配项。

答案 2 :(得分:0)

这个正则表达式应该这样做:

  

$ regex ='/ [附件:(。*?);(。*?);(。*?)] /';

     

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

对我来说,这回来了你想要的东西(3个结果);