用1次运行识别2组“匹配”?

时间:2011-04-20 18:05:57

标签: php regex

我想在文本中获取所有打开和关闭的html标记。

我的意思是这种模式:<[a-z]+></[a-z]+>(不考虑带数字或任何属性的标记或任何xhtml自闭标记)

我的意思是使用2个preg_match_all来获取em:

preg_match_all( '#<([a-z]+)>#i' , $html, $start, PREG_OFFSET_CAPTURE );
preg_match_all( '#<\/([a-z]+)>#i' , $html, $end, PREG_OFFSET_CAPTURE );

第一个会将任何标记放在数组$start中,第二个标记放在$end中。

有没有办法让em只使用preg_match_all的单个实例? (我认为只有1个preg函数会快得多)

由于

4 个答案:

答案 0 :(得分:2)

preg_match_all( '#</?([a-z]+)>#i' , $html, $start, PREG_OFFSET_CAPTURE );

将捕获开启和关闭标签。

答案 1 :(得分:1)

考虑

preg_match_all( '#</?([a-z]+)>#i' , $html, $end, PREG_OFFSET_CAPTURE );

意味着/可能存在或可能不存在。

答案 2 :(得分:0)

请阅读this answer以解决使用正则表达式解析HTML的一般问题。这是Stack Overflow历史上评价最高的答案。然后阅读该线程中的一些其他答案,以获取正确的工具。

答案 3 :(得分:-3)

不要使用正则表达式来解析html。而是查看此信息以获取有关可以为您提供所需内容的优秀解析器的更多信息:

html parser for php

[UPDATE]

那么对于那些对正则表达式充满热情的路透社来说,告诉我如何解释这些结果以及它们与@ yes123想要的完全匹配?

<?
$html = <<<HTML
<html>
<head>
<body a="asdf">
<br />
<p>
broken document

<br>

good luck with that
</body>
HTML;

preg_match_all( '#</?([a-z]+)>#i' , $html, $start, PREG_OFFSET_CAPTURE );

var_dump($start[0]);
?>

给出:

array(2) {
  [0]=>
  array(5) {
    [0]=>
    array(2) {
      [0]=>
      string(6) "<html>"
      [1]=>
      int(0)
    }
    [1]=>
    array(2) {
      [0]=>
      string(6) "<head>"
      [1]=>
      int(7)
    }
    [2]=>
    array(2) {
      [0]=>
      string(3) "<p>"
      [1]=>
      int(37)
    }
    [3]=>
    array(2) {
      [0]=>
      string(4) "<br>"
      [1]=>
      int(58)
    }
    [4]=>
    array(2) {
      [0]=>
      string(7) "</body>"
      [1]=>
      int(84)
    }
  }
  [1]=>
  array(5) {
    [0]=>
    array(2) {
      [0]=>
      string(4) "html"
      [1]=>
      int(1)
    }
    [1]=>
    array(2) {
      [0]=>
      string(4) "head"
      [1]=>
      int(8)
    }
    [2]=>
    array(2) {
      [0]=>
      string(1) "p"
      [1]=>
      int(38)
    }
    [3]=>
    array(2) {
      [0]=>
      string(2) "br"
      [1]=>
      int(59)
    }
    [4]=>
    array(2) {
      [0]=>
      string(4) "body"
      [1]=>
      int(86)
    }
  }
}