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
        )

)

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

4

3 回答 3

3

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

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

除了否定字符集,您还可以.*?使用非贪婪匹配;但是,我更喜欢使用前瞻集。

于 2013-05-27T15:40:19.617 回答
0

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

于 2013-05-27T15:34:16.247 回答
0

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

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

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

对我来说,这得到了你想要的结果(3 个结果);

于 2013-05-27T15:39:25.367 回答