2011-03-11 216 views
0

我想匹配來自HTML源的特定跨度標籤。正則表達式 - 貪婪 - 匹配HTML標籤,內容和屬性

標記的lang-attribute和內部HTML用作返回新字符串的函數的參數。

我想用被調用函數的結果替換舊的標籤,屬性和內容。

受試者將是這樣的:

<p>Some codesnippet:</p> 
<span lang="fsharp">// PE001 
let p001 = [0..999] 
      |> List.filter (fun n -> n % 3 = 0 || n % 5 = 0) 
      |> List.sum 
</span> 
<p>Another code snippet:</p> 
<span lang="C#">//C# testclass 
class MyClass { 
} 
</span> 

爲了提取lang屬性的值和所述內容,我基團與下式的那些值:

​​

由於正則表達式往往是貪婪的,這個表達式匹配完整的主題,而不僅僅是一個span標籤及其內容。

我如何設法匹配一個跨度標籤?

+1

對於操縱html標記,你最好使用正確的工具進行工作。 PHP爲您提供了DOMDocument,它是爲任務而構建的。 Tehre也是XMLReader和SimpleXML。雖然他們不太合適,但他們仍然可以很好地處理XHTML。 – GordonM 2011-03-11 12:09:39

+0

我認爲你需要備份一個步驟,並問,這是一個明智的使用'lang'屬性嗎?*或者,*我應該試圖嵌入HTML代碼這樣?* – 2011-03-11 12:46:15

+0

這意味着你有更好的解決任務的想法 - 請解釋並分享你的想法! :) – fjdumont 2011-03-14 08:16:56

回答

5

我們再也不會重複它:不使用正則表達式來處理HTML!


取而代之,使用DOMDocument::loadHTML

這將讓您操作使用DOM,這是更強大,更容易你的HTML數據:您將能夠:

真的:花時間學習DOM:這是一筆不錯的投資!

+0

...是啊,不要忘記學習使用HTML Tidy,因爲DOMDocument將無法使用無效的HTML – 2011-03-11 12:07:56

+0

謝謝!我甚至不知道PHP提供DOM處理程序;) – fjdumont 2011-03-11 12:20:12

+0

不客氣:-)與那些玩得開心! – 2011-03-11 12:20:52

1

可以指定它是ungreedy使用?

/(<span lang="(.*?)">(.*?)<\/span>)/is

或使用PCRE_UNGREEDY modifier

/(<span lang="(.*)">(.*)<\/span>)/Uis

1

只是增加使所有表達默認ungreedy?,我認爲

/(<span lang="(.*?)">(.*?)</span>)/is