- Автор темы
- #1
Perl/PCRE регулярки
xxxx-искомый тег
Открывающий тег:
	
	
	
		
Закрывающий тег
	
	
	
		
Одиночный тег, с учетом возможно XML фомата(напр. <br/>, <img/>)
	
	
	
		
Парный тег, не имеющий вложенных тегов такого же типа (напр. <a...>...</a> <h1>....</h1>)
	
	
	
		
Парный тег, возможно имеющий вложенные теги такого же типа(напр. <div>...<div>...</div>...</div>)
	
	
	
		
Пример: найти все парные теги определенного вида и вывести их содержимое:
	
	
	
		
	
		
			
		
		
	
				
			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>";
?>