Php 确定两组“数据”;匹配“;跑一次?

Php 确定两组“数据”;匹配“;跑一次?,php,regex,Php,Regex,我想得到一个文本中所有打开和关闭的html标记 我的意思是使用这种模式:和(不考虑带有数字或任何属性的标记或任何xhtml自关闭标记) 我的意思是使用2个preg_match_all来获得它们: preg_match_all( '#<([a-z]+)>#i' , $html, $start, PREG_OFFSET_CAPTURE ); preg_match_all( '#<\/([a-z]+)>#i' , $html, $end, PREG_OFFSET_CAPTURE

我想得到一个文本中所有打开和关闭的html标记

我的意思是使用这种模式:
(不考虑带有数字或任何属性的标记或任何xhtml自关闭标记)

我的意思是使用2个preg_match_all来获得它们:

preg_match_all( '#<([a-z]+)>#i' , $html, $start, PREG_OFFSET_CAPTURE );
preg_match_all( '#<\/([a-z]+)>#i' , $html, $end, PREG_OFFSET_CAPTURE );
preg#u match_all(“##i”、$html、$start、preg#u OFFSET_CAPTURE);
preg#u match_all(“#i”、$html、$end、preg#u OFFSET_CAPTURE);
第一个将把任何标记放在数组
$start
中,第二个放在
$end

是否有一种方法可以仅使用
preg\u match\u all
的单个实例来获取em?(我认为只有1个preg,功能会更快)


谢谢不要使用正则表达式来解析html。相反,请查看此内容,以了解有关可以获取所需内容的优秀解析器的更多信息:

[更新]

因此,对于那些对正则表达式如此热情的反驳者,请告诉我如何解释这些结果,以及它们如何完全符合@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)
    }
  }
}
数组(2){
[0]=>
阵列(5){
[0]=>
阵列(2){
[0]=>
字符串(6)”
[1]=>
int(0)
}
[1]=>
阵列(2){
[0]=>
字符串(6)”
[1]=>
内部(7)
}
[2]=>
阵列(2){
[0]=>
字符串(3)“”
[1]=>
国际(37)
}
[3]=>
阵列(2){
[0]=>
字符串(4)“
” [1]=> 国际(58) } [4]=> 阵列(2){ [0]=> 字符串(7)” [1]=> 国际(84) } } [1]=> 阵列(5){ [0]=> 阵列(2){ [0]=> 字符串(4)“html” [1]=> int(1) } [1]=> 阵列(2){ [0]=> 字符串(4)“头” [1]=> 内部(8) } [2]=> 阵列(2){ [0]=> 字符串(1)“p” [1]=> 内部(38) } [3]=> 阵列(2){ [0]=> 字符串(2)“br” [1]=> 国际(59) } [4]=> 阵列(2){ [0]=> 字符串(4)“正文” [1]=> 国际(86) } } }
考虑

preg_match_all( '#</?([a-z]+)>#i' , $html, $end, PREG_OFFSET_CAPTURE );
preg#u match_all('#i',$html,$end,preg#u OFFSET_CAPTURE);
这意味着/可能存在也可能不存在。

preg\u match\u all(“#i”、$html、$start、preg\u OFFSET\u CAPTURE);
preg_match_all( '#</?([a-z]+)>#i' , $html, $start, PREG_OFFSET_CAPTURE );

将捕获打开和关闭的标记

请阅读使用正则表达式解析HTML的一般问题。这是堆栈溢出历史上评级最高的答案。然后阅读该线程中的其他一些答案,以获得合适的工具。

您是否受限于使用正则表达式?对于这样的情况,DOM解析器几乎肯定会更有表现力。为什么我在这个案例中没有考虑到?,那就祝你好运吧。当您尝试处理标记之间的内容时,异常的数量会增加。令人惊讶的是,有这么多人在学习这一课之前必须走这条路。彼得,谁说过标签之间的文本匹配?OP只想匹配标签。当然,标记也可以放在注释中(在这种情况下,正则表达式不起作用),但是如果您知道这一点,我认为这里的正则表达式没有问题。我发现令人惊讶的是,有多少人仅仅因为看到一句话中提到的“regex”和“html”这个词,就表现出这种鹦鹉学舌的行为,即发布指向某个“著名”SO问题的链接。我同意Peter的观点@Bart和@yes123在我的答案中看到了更新。即使你的html被破坏了,preg_匹配也可以例外。一点问题都没有你读过我的问题吗?你知道在这种情况下正则表达式给出的正是我想要的吗?