2013-01-21 51 views
0

我怎麼能加入這兩種模式,以適應在一個單一preg_match_all: 我有這樣的:加盟兩種模式

preg_match_all("/(<span[^>]*annot[^>]*value=.?(\w*).?[^>]*>)(.*?)<\/span>/", $text, $matches, PREG_OFFSET_CAPTURE); 

這:

preg_match_all("/(<span[^>]*value=.?(\w*).?[^>]*annot[^>]*>)(.*?)<\/span>/", $text, $matches, PREG_OFFSET_CAPTURE); 

我需要的模式一次尋找兩件事

+1

您可以從不使用正則表達式嘗試匹配html開始。在那條路上[謊言瘋狂](http://stackoverflow.com/a/1732454/118068) –

+0

謝謝,但你有更好的方式來做到這一點?不這樣做不是最好的解決方案 – Martin

+0

你想做什麼?提取一些特定的''的內容? –

回答

3

儘管HTML匹配的東西,試試這個:

preg_match_all("/((<span[^>]*annot[^>]*value=.?(\w*).?[^>]*>)(.*?)<\/span>|(<span[^>]*value=.?(\w*).?[^>]*annot[^>]*>)(.*?)<\/span>)/", $text, $matches, PREG_OFFSET_CAPTURE); 

它們通過一個or運營商像這只是合併:

(exp1|exp2) 

編輯:如果我明白你正在嘗試做的,符合「ANNOT =值=」和「值= ANNOT =」,你可以使用這個正則表達式,而不是(希望我沒惹什麼,但你應該明白我的意思):

(<span[^>]*(value=.?(\w*).?[^>]*|annot[^>]*)>)(.*?)<\/span> 
+0

你是否意外發布了這條消息?你對另一個答案寫了同樣的評論。 – Rudolf

2
preg_match_all("/(<span[^>]*(?:(?:annot|value=.?(\w*).?)|(?:value=.?(\w*).?|annot))[^>]*>)(.*?)<\/span>/", $text, $matches, PREG_OFFSET_CAPTURE); 

無論如何,我建議你使用PHP [文檔對象模型] [1],而不是因爲這是非常討厭的編輯使用正則表達式來解析HTML數據。

<?PHP 

    $DOM = new DOMDocument; 
    $DOM->loadHTML($HTML); 

    $items = $DOM->getElementsByTagName('span'); 

    foreach ($items as $item) 
    { 
     foreach ($item->attributes as $attribute) 
     { 
      if (($attr->nodeName == "name") && ($attr->nodeName == "annotation")) 

      //.... 
?> 
+0

確定你的答案是正確的,但我沒有得到我需要的東西,我已經添加了一個例子 – Martin

+0

確定這樣做會更好,但我需要文本中跨度的初始位置:( – Martin

+0

你是什麼意思? –