在Regex中搜索动态术语两次

时间:2012-04-07 14:12:14

标签: php regex preg-replace preg-match

我知道我可以在PHP中使用正则表达式来替换该术语的动态部分:

preg_replace('/(test1)(test2)(test3)/',"$3$2$1",$string);

(不知怎的,我不知道这是否正确,但它不是我想要的)

我希望在正则表达式中,例如:

preg_match_all("~<(.*)>.*</$1>~",$string,$matches);

“&lt;”之间的第一部分和“&gt;”是动态的(因此可以找到html中存在的每个标签,甚至可以找到自己的xml标签),我想在同一个正则表达式中再次引用它。

但它对我不起作用。这甚至可能吗? 我有一台PHP 5.3的服务器

/编辑:

我的最终目标是:

如果有一个带有e的html页面。 G。以下源代码: HTML

<html>
  <head>
    <title>Titel</title>
  </head>
  <body>
    <div>
      <p>
        p-test<br />
        br-test
      </p>
      <div>
        <p>
          div-p-test
        </p>
      </div>
    </div>
  </body>
</html>

处理后应该看起来像

$htmlArr = array(
    'html' => array(
            'head' => array('title' => 'Titel'),
            'body' => array(
                'div0' => array(
                    'p0' => 'p-test<br />br-test',
                    'div1' => array(
                        'p1' => 'div-p-test'
                    )
                )
            )
    ));

1 个答案:

答案 0 :(得分:1)

替换字符串中的占位符使用$1语法。在正则表达式本身中,它们被称为反向引用,并遵循语法\1反斜杠和数字 http://www.regular-expressions.info/brackets.html

所以在你的情况下:

preg_match_all("~<(.*?)>.*?</\\1>~",$string,$matches);

反斜杠在这里加倍,因为在PHP字符串中,反斜杠会自行转义。 (特别是对于双引号字符串,否则它将成为ASCII符号。)