我想捕获下面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);
额外的?
表示"非贪婪匹配",它将在找到]
后停止