2011-11-28 21 views
0

我有以下PHP preg_replace如何使用php preg_replace和相同的'match'兩次?

  $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函數搜索與類Heading1,應像更換任何<p>一個HTML文檔:

<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 
); 
+0

嘗試將\\ 2更改爲$ 2,與您在第一次參考時使用的一樣。 – TRD

+0

可能有一些非常明顯的我缺少的東西,但爲什麼一個'$ 2'和一個'\\ 2'? – DaveRandom

+0

嗨DaveRandom,TRD - $ 2和\\ 2返回相同的結果「span class =」 - 我已經更新了相應的問題 – kaese

回答

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語法高亮是狡猾的,因爲這麼不喜歡here文檔,但它的工作... ..說實話。

+0

感謝DaveRandom - 但我似乎得到了一個稍微不同的結果 - 我的

現在似乎沒有任何變化 - 就像

簡介

kaese

+1

請編輯你的問題, 。 – DaveRandom

+0

謝謝DaveRandom--詳細地查看HTML似乎解決了我的問題......查看我的編輯:) – kaese