- Автор темы
- #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>";
?>