2009-11-06 33 views
1

我有一個包含在HTML的各個地方的兩個錨標記一個HTML片段匹配第二標籤。如何在這個字符串

<span id="ctl00_PlaceHolderTitleBreadcrumb_ContentMap"> 
    <span><a class="ms-sitemapdirectional" href="/">My Site</a></span> 
    <span> &gt; </span> 
    <span><a class="ms-sitemapdirectional" href="/Lists/Announcements/AllItems.aspx">Announcements</a></span> 
    <span> &gt; </span> 
    <span class="ms-sitemapdirectional">Settings</span> 
</span> 

我期待寫一個正則表達式,將返回第二錨標記,其中有「通告」,因爲它是文本。在試圖寫一個表達式時,我不斷得到兩個錨標籤 - 但我只對第二個標籤感興趣。

是否有可能在第二標記只匹配?

編輯:

我永遠知道我在尋找具有「公告」在它的錨標籤的文本,如果沒有什麼幫助。

+0

這是一個命令行工具嗎? – 2009-11-06 17:23:38

+0

[可以提供一些爲什麼很難用正則表達式分析XML和HTML的例子嗎?](http://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-爲什麼它很難解析xml和html-with-a-rege) – 2011-07-09 20:53:06

+2

[RegEx match open tags not except XHTML self-contained tags](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – 2011-09-15 14:17:29

回答

7

解析片段到一個DOM錯誤的工具。使用XPath發行:

(//a)[2] 

完成。

+0

用於使用DOM而不是RegEx的+1。 – TrueWill 2009-11-06 18:22:24

+0

我認爲這是最接近我正在尋找,而不是使用正則表達式。 – 2009-11-09 08:59:42

1

/<a.+?>[^<>]*Announcements[^<>]*</a>/ 

PS。正則表達式是解析HTML

+0

+1「正則表達式是解析html的錯誤工具」 - 絕對是。 – TrueWill 2009-11-06 18:23:04

1
/(<a.*?<\/a>).*?(<a.*?<\/a>)/ 

$ 1匹配的第一個標籤,$ 2場比賽第二

0

你不必使用複雜的正則表達式這一點,如果你不想。因爲你想獲得錨,錨通常已經結束標記</a>,你可以用你喜歡的語言和每行做</a>分裂。 如僞

for each line in htmlfile 
do 
    var=split line on </a> 
    for each item in var 
    do 
     if item has "Announcement" then 
      print "found" 
     end if 
    done 
done 
0
<?php 
$string = '<span id="ctl00_PlaceHolderTitleBreadcrumb_ContentMap"><span><a class="ms-sitemapdirectional" href="/">My Site</a></span><span> &gt; </span><span><a class="ms-sitemapdirectional" href="/Lists/Announcements/AllItems.aspx">Announcements</a></span><span> &gt; </span><span class="ms-sitemapdirectional">Settings</span></span>'; 

$dom = new DOMDocument(); 
$dom->loadHTML($string); 
$anchors = $dom->getElementsByTagName('a'); 
if ($anchors->length) { 
    $secondAnchor = $anchors->item(1); 
    echo innerHTML($secondAnchor->parentNode); 
} 

function innerHTML($node){ 
    $doc = new DOMDocument(); 
    foreach ($node->childNodes as $child) 
    $doc->appendChild($doc->importNode($child, true)); 

    return $doc->saveHTML(); 
} 
0

如果你知道元素的確切文字,你知道這是同類型的片段的最後一個元素,你有足夠多的信息與一個正則表達式匹配它更多。我懷疑你使用正則表達式是這樣的:

/<a\s+.*>Announcements<\/a>/s 

...和.*是匹配第一錨標記的<a,第二個的>Announcements</a>之間的一切。切換到非貪婪的量詞:

/<a\s+.*?>Announcements<\/a>/s 

...沒有幫助;一個不情願的量詞儘快停止匹配,但這裏的問題是,它開始匹配太快。您需要更換.*有更具體的東西,這東西只能匹配的開<a和關閉單個標籤的>之間無論發生什麼事:

/<a\s+[^<>]+>Announcements<\/a>/ 

現在,當它到達第一<a>標籤的結束和沒有看到Announcements</a>將中止那場比賽的嘗試,待着並重新開始在第二<a>標籤。