2017-01-29 63 views
-1

我試圖找到兩個標籤之間的所有內容,即使標籤中存在相同的標籤(一種奇怪的解釋)。查找標籤之間的所有內容

那麼這裏是一個例子:this <tag id="1">is an <tag id="2">example</tag> for</tag> tags <tag id="3">in tags</tag>

我能夠獲得標籤之間的所有內容,但不是配對之類的東西。

我正則表達式是這樣的:<tag id="(.*?)">(.*?)</tag>

我怎麼能告訴我的正則表達式來看看是否有<tag>然後忽略下一個</tag>?那是一個無限的時代。

因爲我正在使用php,有沒有更好更快的解決方案?

輸出應該是這樣的:

id => content 
- 1 => is an <tag id="2">example</tag> for 
- 2 => example 
- 3 => in tags 
+0

會不會[strip_tags](http://php.net/manual/en/function.strip-tags.php)做這項工作? – xzoert

+0

謝謝,我忘記了我有之間的東西。我將其添加到我的示例中。如果我沒有我需要的'id'部分,strip_tags會很棒。 –

+0

您沒有指定輸出。 – revo

回答

1

你有一個已經串結構與衆所周知的語法和PHP已建立的工具來分析此語法。沒有理由對正則表達式或字符串函數使用字符串方法。

在這個例子中,我選擇DOMDocument::loadHTML來代替DOMDocument::loadXML,使得解析器更寬鬆,但是如果您有格式良好的XML文檔,則不需要此更改。

我認爲每個<tag>節點都有一個id屬性,但如果情況並非總是如此,你可以在第一foreach循環使用DOMNode::hasAttribute簡單地測試了它的存在。

$html = 'this <tag id="1">is an <tag id="2">example</tag> for</tag> tags <tag id="3">in tags</tag>'; 

$dom = new DOMDocument; 
$state = libxml_use_internal_errors(true); 
$dom->loadHTML($html); 
libxml_use_internal_errors($state); 

$nodeList = $dom->getElementsByTagName('tag'); 

$results = []; 

foreach ($nodeList as $node) { 
    $content = ''; 
    foreach ($node->childNodes as $child) { 
     $content .= $dom->saveHTML($child); 
    } 
    $results[$node->getAttribute('id')] = $content; 
} 

print_r($results); 
+0

非常感謝你。只是一個通過:是否有可能使用相同的例子爲像bbcodes([b] .. [/ b],[url = http:// ...我的網址[/ url])還是另一個話題? –

+0

@ Mr.Tr33:同樣的想法,它也是一個結構化的字符串,搜索一個bbcode解析器。 –