我怎么能用php preg_replace&相同的'匹配'两次?

时间:2011-11-28 10:30:41

标签: php preg-replace

我有以下PHP preg_replace

            $src = preg_replace
            (
            array(
                '/(?si)<p\s+class\s*=\s*"Heading1(.*?)"\s*>(.*?)<\/p>/'
            ),
            array(
                "<h1>$2<tocentry content='$2' level='0' /></h1>"
            ),
                $src
            );

preg_replace在HTML文档中搜索具有类<p>的任何Heading1,并应将其替换为:

<h1>Introduction<tocentry content='Introduction' level='0' /></h1>

然而,我实际得到的是:

<h1>Introduction<tocentry content='span class=' level='0' /></h1>

我正在使用相同的匹配引用('2') - 但是每个都收到不同的结果。怎么会这样?

非常感谢

修改

问题显示在HTML preg_replacing$src)中。

<p>作为孩子有一个<span>,这导致了奇怪的结果。

我现在使用以下内容,效果很好:

$src = preg_replace
(
array(
    '/(?si)<span\s+class\s*=\s*"Heading1-H(.*?)"\s*>(.*?)<\/span>/'
),
array(
    "<h1>$2<tocentry content='$2' level='0' /></h1>"
), 
    $src
);

1 个答案:

答案 0 :(得分:0)

$src = <<<EOD
   <sometag>Content here content here content here</sometag>
   <p class="Heading1stuffstuff">Introduction</p>
   <anothertag> More Content. </anothertag>
EOD;

$result = preg_replace (
  array(
    '/<p\s+class\s*=\s*"Heading1([^"]*)"\s*>([^<]*)<\/p>/si'
  ),
  array(
    "<h1>$2<tocentry content='$2' level='0' /></h1>"
  ),
  $src
);

print $result;

/* Outputs:
   <sometag>Content here content here content here</sometag>
   <h1>Introduction<tocentry content='Introduction' level='0' /></h1>
   <anothertag> More Content. </anothertag>
*/

NB 语法突出显示是狡猾的,因为SO不喜欢HEREDOC,但它确实有效...诚实...