1

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

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

(不知何故,我不知道这是否正确,但这不是我要找的)

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

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

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

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

/编辑:

我的最终目标是:

如果有一个带有例如以下源代码的 html 页面: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'
                    )
                )
            )
    ));
4

1 回答 1

1

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

所以在你的情况下:

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

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

于 2012-04-07T14:18:50.993 回答