我想在下面的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
)
)
答案 0 :(得分:8)
当匹配贪婪时,它将忽略满足正则表达式的第一种情况,并将继续尝试匹配,直到它消耗尽可能多的输入为止。
通常这涉及添加?
,但我不确定在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);
额外?
表示“非贪婪匹配”,它会在找到]
后停止