2012-04-07 20 views
1

兩次我知道我可以在更換指長期的動態部分的正則表達式在PHP中:動態搜索術語的正則表達式

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

(不知這個樣子,我不知道這是正確的,但它不是我所期待的)

我想,在正則表達式,如:

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

的「<」之間的第一部分「>」是動態的(所以每一個標籤在HTML現有的和甚至自己的XML標籤可以是f ound),我想在同一個正則表達式中再次提到這一點。

但它不適用於我。這甚至有可能嗎? 我有PHP 5.3

/編輯服務器:

我的最終目標是:

如果有一個HTML頁面隨e。 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' 
        ) 
       ) 
      ) 
    )); 
+2

您不得使用常規rexpressions處理HTML或XML。 [有這種工作的工具。](http://php.net/manual/en/class.domdocument.php)使用它們。 – Tomalak 2012-04-07 14:14:55

+1

[永遠不要使用正則表達式來解析HTML/XML](http://stackoverflow.com/a/1732454/383609)。這不是一種常規的語言。改爲使用[HTML/XML解析器](http://php.net/manual/en/class.domdocument.php)。 – Bojangles 2012-04-07 14:15:15

+0

你提出的結構沒有意義。將文件解析爲DOM並使用它有什麼問題? (除了你認爲數組比DOM更容易,這不是一個足夠好的理由) – Tomalak 2012-04-08 19:38:51

回答

1

佔位符使用$1語法之後。在正則表達式本身中,它們被稱爲反向引用,並遵循語法\1反斜槓和數字。
http://www.regular-expressions.info/brackets.html

所以你的情況:

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

反斜槓這裏一倍,因爲在PHP字符串中的反斜槓本身。 (特別是對於雙引號字符串,否則它將成爲ASCII符號。)

+0

...並且肯定有人會寫一個正則表達式來處理HTML,因爲對於那些不懂正則表達式的人來說,它不會提出有關它們的問題。 – Tomalak 2012-04-07 14:22:39

+0

我總是試圖爲大括號交換角度,以免違反神聖的SO解析感受。但這裏的實際問題是關於反向引用。把玩笑頁面搓到新手上並沒有太大的成就。 – mario 2012-04-07 14:29:14

+0

給他們感覺他們可以用正則表達式解析HTML,畢竟,這都是誇張的誇張,也沒有幫助。我的觀點是,如果OP使用正則表達式不夠聰明並自己想出來,那麼爲他修正正則表達式實際上是一個危險的建議。呵呵,我沒有在任何笑話頁面上蹭過,我鏈接到'DOMDocument'。 – Tomalak 2012-04-07 14:42:26