正则表达式寻找方括号[]中的字符串

5
我想在下面的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个回答

10

你的正则表达式是贪婪的。如果想要实现你想要的结果,就需要停止贪婪匹配。在这里了解有关贪婪性的更多信息。

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

通常情况下,可以通过添加?来解决贪婪问题,但我不确定在php中是否适用。你可以尝试:

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

6
preg_match_all("#\[[^\]]*\]#",$html,$fields, PREG_PATTERN_ORDER);
< p > 用于标记字符串的开始的符号是 ^,所以我使用 #| 作为定界符来避免混淆。此外,我使用 [^\]*] 而不是 .*? 因为它能够确保在遇到 ] 时停止匹配,而你需要在你的 .上使用懒惰模式修饰符,甚至可能需要使用 m 模式修饰符以确保它捕获换行符(如果你的属性决定包含它们)。< /p >

3

使用

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接