2014-04-09 41 views
0

,如果你看看这个标签:preg_match_all skippes一个嵌套的标签

$text = '<div class="inner"> 
    <div class="left"> 
     <h4>text </h4> 
     <p>Abdijstreet 42b<br>2000 city </p> 
    </div> 
    <div class="right"> 
     <span class="red">10:00 - 14:00</span> 
    </div> 
</div>' 

我用这个来的preg_match:

preg_match_all("'<div class=\"inner\">(.*?)</div>'si", $text, $match); // de ul tags 

      $match[1] = array_splice($match[0], 0); 

     foreach($match[1] as $val) // hele pagina 
     { 
       echo $val; 
       } 

嗯,我尝试了很多东西,但我只得到什么之间,从来没有什么我需要,我做错了什么?

回答

0

您是否想要在开始和结束div标签之间获得所有内容?如果是这样,那么你真的很接近。您只需从表达式中删除问号?即可。问号告诉脚本一旦找到REGEX中的下一个项目就停止匹配。在这种情况下,下一个项目是一个闭合的div标签。所以一旦找到它,它就会停止。如果将其保留,它将保持匹配状态,直到它找到它可以找到的最后一个div标签。

$text = '<div class="inner"> 
    <div class="left"> 
     <h4>text </h4> 
     <p>Abdijstreet 42b<br>2000 city </p> 
    </div> 
    <div class="right"> 
     <span class="red">10:00 - 14:00</span> 
    </div> 
</div>'; 

preg_match_all("'<div class=\"inner\">(.*)</div>'si", $text, $match); 

print "<pre><font color=red>"; print_r($match); print "</font></pre>"; 

如果你想每个项目拉出来在一个div,那么你可能要考虑使用DOM,而不是正则表达式来解决这个问题。但是,由于您使用标签,然后在这里它是在正则表达式:

preg_match_all('~<div class="(?!inner).*?>\K(.*?)(?=</div>)~ims', $text, $matches); 

print "<PRE><FONT COLOR=BLUE>"; print_r($matches[1]); print "</FONT></PRE>"; 

这就给了你这样的:

Array 
(
    [0] => 
      <h4>text </h4> 
      <p>Abdijstreet 42b<br>2000 city </p> 

    [1] => 
      <span class="red">10:00 - 14:00</span> 

) 

正则表达式的说明:

<div class=" (?!inner) .*? > \K (.*?) (?=</div>) 
    ^  ^ ^^^ ^  ^
     1   2  3 4 5  6   7 
  1. <div class="寻找文字开放的div标签<div,随后一个空格,然后是单词类,后跟一个等号,后跟一个引号。
  2. (?!inner)这是一个负面预测(?!),确保单词inner接下来不会出现。
  3. .*?匹配任何一个字符.,零次或多次*,一直到它碰到我们的正则表达式?中的下一项。在这种情况下,一旦它找到一个闭合的HTML括号就会停止。
  4. >查找一个闭合的HTML括号。
  5. \K这会告诉表达式忘记它到目前为止匹配的所有内容,然后再次从这里开始匹配。这基本上确保表达式的第一部分存在,但不存储它供我们使用。
  6. (.*?)与3号相同,只是我们在其周围使用括号(),以便我们可以捕获它并稍后使用它。
  7. (?=</div>)这是一个积极的前瞻(?=),确保关闭div标记</div>即将在表达式结尾,但不捕获它。

Here is a working demo of the code above