2012-03-12 231 views
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 
     ) 

) 

回答

7

你的正则表达式是贪婪之后。你需要阻止它贪婪地做你想做的事。多了解一下贪婪here

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

通常这包括添加?但我不是在PHP肯定的,但你可以尝试:

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

使用

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

额外?的意思是 “非贪婪匹配” 将停止]发现

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

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

相关问题