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

Статус
В этой теме нельзя размещать новые ответы.

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>";

?>
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху