2011-03-07 24 views
1

我正在解析一些HTML,這是我在表單中生成的。這是一個令牌系統。我試圖從後面的正則表達式中獲取信息,但不知何故,這只是第一場比賽。我在網上找到了一個正則表達式,除了能夠處理多個事件外,幾乎完成了我所需要的。正則表達式找不到所有變量

我希望能夠用找到的字符串生成的內容替換找到的內容。

所以,這裏是我的代碼:

$result = preg_replace_callback("/<\/?\w+((\s+(\w|\w[\w-]*\w)(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>\[\*.*\*\]\<\/[a]\>/i", array(get_class($this), 'embed_video'), $str); 
     public function embed_video($matches) 
{ 
    print_r($matches); 
    return $matches[1] . 'foo'; 
} 

我真的只需要的屬性,因爲它們containt所有的有價值的信息。標籤的內容僅用於查找令牌。這是什麼需要做的一個例子:

<a type="TypeOfToken1" id="IdOfToken1">[*SomeTokenTitle1*]</a> 
<a type="TypeOfToken2" id="IdOfToken2">[*SomeTokenTitle2*]</a> 

preg_replace_callback()在此之後應返回:

type="TypeOfToken1" id="IdOfToken1" type="TypeOfToken2" id="IdOfToken2" 

但是,回調函數輸出匹配,但不與返回替換它們。因此,$resultpreg_replace_callback之後保持不變。可能是什麼問題呢?


與實際數據的例子:

輸入:

<p><a id="someToken1" rel="someToken1">[*someToken1*]</a> sdfsdf <a id="someToken2" rel="someToken2">[*someToken2*]</a></p> 

返回$result:從print_r()

id="someToken1" rel="someToken1"foo 

返回,如果回調函數:

Array ([0] => [*someToken1*] sdfsdf [*someToken2*] [1] => id="someToken1" rel="someToken1" [2] => rel="someToken1" [3] => rel [4] => ="someToken1") 

我認爲它沒有返回它應該的兩個字符串。

+2

[解析HTML的最佳方法]的可能的重複(http://stackoverflow.com/questions/3577641/best-methods-to-parse-html) – Gordon 2011-03-07 12:53:44

+0

你的代碼片段工作正常(除了剝離開始的標籤)。這聽起來很可能是你在'$ str'中查找結果而不是'$ result'。 – mario 2011-03-07 12:57:08

+0

我不認爲這個問題值得讚賞。但是,如何從HTML解析X已經被回答了很多次。嘗試使用關鍵字「DOM」進行搜索。 – Gordon 2011-03-07 12:58:22

回答

1

對於任何人都陷入這樣的問題,嘗試檢查您的正則表達式,它是修飾符。

關於解析文檔,我仍然在做,只是不是HTML標籤。我有更多的文字,可以更容易地解析。在我的情況下:[*TokeName::TokenDetails*]