regex查找方括号[]中的字符串


regex to find string within square brackets []

我想捕获下面html字符串中方括号内的文本。但是我下面的正则表达式并没有分别得到'image'和imagealt',而是返回'images]"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
        )
)

您的正则表达式是贪婪的。你需要阻止它贪婪地做你想做的事。在这里了解更多关于贪婪的信息。

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

通常这需要添加一个?,但我在php中不确定,但您可以尝试:

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

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

使用

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

额外的?表示"非贪婪匹配",它将在找到]后停止