正则表达式在方括号[]中找到字符串

时间:2012-03-12 10:08:30

标签: php regex

我想在下面的html字符串中的方括号内捕获文本。 但是我下面的正则表达式并没有单独获得'image'和imagealt',而是返回'image'“alt =”[imagealt'而不是。如果我从字符串中取出alt =“[imagealt]”,它就像我期望的那样返回。

$html = '<h2>[title]</h2>
<div class="content"><img src="[image]" alt="[imagealt]" /></div>
<div class="content">[text]</div>';

preg_match_all("^\[(.*)\]^",$html,$fields, PREG_PATTERN_ORDER);

echo "<pre>";
print_r($fields);
echo "</pre>";


Array
(
    [0] => Array
        (
            [0] => [title]
            [1] => [image]" alt="[imagealt]
            [2] => [text]
        )

    [1] => Array
        (
            [0] => title
            [1] => image]" alt="[imagealt
            [2] => text
        )

)

3 个答案:

答案 0 :(得分:8)

你的正则表达式是贪婪的。你需要阻止它贪婪地做你想做的事。详细了解贪婪here

当匹配贪婪时,它将忽略满足正则表达式的第一种情况,并将继续尝试匹配,直到它消耗尽可能多的输入为止。

通常这涉及添加?,但我不确定在php中,但您可以尝试:

preg_match_all("^\[(.*?)\]^",$html,$fields, PREG_PATTERN_ORDER);

答案 1 :(得分:5)

preg_match_all("#\[[^\]]*\]#",$html,$fields, PREG_PATTERN_ORDER);

^插入符号用于标记字符串的开头,因此我使用#|作为分隔符以避免混淆。另外,我使用[^\]*]代替.*?,因为一旦它到达]的末尾肯定会停止,而你需要.上的懒惰修饰符甚至是m修饰符,以确保在属性决定包含它们时捕获换行符。

答案 2 :(得分:3)

使用

     preg_match_all("^\[(.*?)\]^",$html,$fields, PREG_PATTERN_ORDER);

额外?表示“非贪婪匹配”,它会在找到]后停止