В коллекцию:Поиск тегов

Тема в разделе "Регулярные выражения", создана пользователем RolCom, 18 окт 2008.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Perl/PCRE регулярки

    xxxx-искомый тег

    Открывающий тег:
    Код:
    {
    <xxxx(?:\s++    
      (?:\s*+[a-z\d-]++     #атрибут
          (?:\s*+=\s*+   (?:"[^"]*+"|'[^']*+'|[^<>"'\s]+))? )*+  #значение атрибута
    )?
    \s*+>
    }xi
    Закрывающий тег
    Код:
    {<xxxx\s*+>}i
    Одиночный тег, с учетом возможно XML фомата(напр. <br/>, <img/>)
    Код:
    {<xxxx(?:\s++    
      (?:\s*+[a-z\d-]++    
          (?:\s*+=\s*+   (?:"[^"]*+"|'[^']*+'|[^<>"'\s]+))? )*+
    )?
    \s*+/?+>}xi
    Парный тег, не имеющий вложенных тегов такого же типа (напр. <a...>...</a> <h1>....</h1>)
    Код:
    {<xxxx(?:\s++    
      (?:\s*+[a-z\d-]++    
          (?:\s*+=\s*+   (?:"[^"]*+"|'[^']*+'|[^<>"'\s]+))? )*+
    )?
    \s*+>
    .*?
    </xxxx\s*+>}xi
    Парный тег, возможно имеющий вложенные теги такого же типа(напр. <div>...<div>...</div>...</div>)
    Код:
    {<xxxx(?:\s++
      (?:\s*+[a-z\d-]++
          (?:\s*+=\s*+   (?:"[^"]*+"|'[^']*+'|[^<>"'\s]+))? )*+
    )?
    \s*+>
    (?:(?R)|[^<>]++|
         <\[a-z][a-z0-9]*+(:[a-z][a-z0-9]*+)*+
           (?:\s*+[a-z\d-]++
               (?:\s*+=\s*+   (?:"[^"]*+"|'[^']*+'|[^<>"'\s]+))? )*+
         \s*+/?+>|
         </[a-z][a-z0-9]*+(:[a-z][a-z0-9]*+)*+\s*+>
    )*?
    </xxxx\s*+>}xi
    
    Пример: найти все парные теги определенного вида и вывести их содержимое:
    Код:
    <?php
    $text=<<<EOF
    <div id="1"><div id="2">превед</div></div>
    EOF;
    
    $tag='div';
    $re=<<<EOF
    {
    (?<open>
    	<$tag(?:\s++
    	  (?:\s*+[a-z\d-]++
    	      (?:\s*+=\s*+   (?:"[^"]*+"|'[^']*+'|[^<>"'\s]+))? )*+
    	)?
    	\s*+>
    )
    (?=
      (?<content>
    	(
    		<$tag(?:\s++
    		  (?:\s*+[a-z\d-]++
    			  (?:\s*+=\s*+   (?:"[^"]*+"|'[^']*+'|[^<>"'\s]+))? )*+
    		)?
    		\s*+>
    		(?-1)
    		</$tag\s*+>
    		|   
    		 [^<>]++|
    	     <(?!$tag [\s>])[a-z][a-z0-9]*+(:[a-z][a-z0-9]*+)*+
    	       (?:\s*+[a-z\d-]++
    	           (?:\s*+=\s*+   (?:"[^"]*+"|'[^']*+'|[^<>"'\s]+))? )*+
    	     \s*+>|
    	     </(?!$tag [\s>])[a-z][a-z0-9]*+(:[a-z][a-z0-9]*+)*+\s*+>|
    		 <[a-z][a-z0-9]*+(:[a-z][a-z0-9]*+)*+
    	       (?:\s*+[a-z\d-]++
    	           (?:\s*+=\s*+   (?:"[^"]*+"|'[^']*+'|[^<>"'\s]+))? )*+
    	     \s*+/>
    		 
    	)*?
      )
      (?<close>
      	</$tag\s*+>
      )
    )
    }xi
    EOF;
    
    $n= preg_match_all($re, $text, $m);
    
    for($i=0; $i<$n; $i++) 
      echo htmlspecialchars($m['open'][$i].'['.$m['content'][$i].']'.$m['close'][$i])."<br>";
    
    ?>
    
     
    Dador нравится это.
Статус темы:
Закрыта.