2013-03-07 34 views
-2

我希望與classbc-de fg把所有的標籤a之間的內容在一個HTML文件中,就像這樣:如何使用正則表達式獲取HTML中給定屬性的標籤內容?

<a class="bc-de fg"> XXXXXXXXXXXXX </a> 

所以我寫了下面的正則表達式:

$regexp = 「<a\wclass="bc\wde">(.*?)<\/a>」 

這沒有工作。我對正則表達式很陌生,所以我試圖獲得更多練習。

我該如何糾正這個正則表達式?

+2

Cthulhu here ...使用DOM解析器。 – 2013-03-07 07:28:28

+1

相關:http://stackoverflow.com/a/1732454/78845 – Johnsyweb 2013-03-07 07:30:24

回答

0

試着這麼做$regex = ":<a class="bc-de fg">(.*?)</a>:mi";

  • 我使用的分隔符:所以我沒有逃避斜線
  • .匹配除換行符\ r和\ n任何單個字符的所有時光。
  • *?重複上一項零次或多次。

下面是一個簡單的cheatsheet,你可能會覺得有用。

0

對於HTML或任何嵌套結構,regex被認爲是不好的做法。改爲使用DOM

你在正則表達式中的問題是轉義字符(在單引號之間放置正則表達式字符串)。而且您還沒有開始和結束的正則表達式字符(#...#\...\)。

+0

這是作爲答案發布的,但它不會嘗試回答問題。它應該可能是一個評論或完全刪除。 – Johnsyweb 2013-03-07 07:29:42

+0

是的,我知道,但我希望使用reg ex來做... – lkkeepmoving 2013-03-07 07:30:14

+1

這個編輯更像是一個答案☺ – Johnsyweb 2013-03-07 07:50:18

0

試試這個:

$str = '<a class="bc-de fg">Testing</a>'; 

preg_match('/<a class="bc\-de\s*fg">(?P<link>.*)<\/a>/',$str,$matches); 

echo "<pre>"; 
print_r($matches); 

您將獲得$link = $matches['link'];

鏈接這會給你更準確的結果:

preg_match('/<a.*class="bc\-de\s*fg".*>\s*(?P<link>.*)\s*<\/a>/',$str,$matches);

+0

爲什麼我可以直接使用空格?我不應該用\ w? – lkkeepmoving 2013-03-07 07:34:04

+0

您可以使用空格,但\ s是空格的常規exp模式,因爲您需要我使用的錨標記中的所有文本。*而不是\ w – 2013-03-07 07:37:10

0

試試這個:

$regexp = '/<a class="bc-de fg">(.*)<\/a>/'; 
preg_match_all($regexp, $subject, $matches); 

您的回答將在$matches。它應該適用於剛剛提到的場景。但如果情況是,如果屬性順序改變或更多的類被分配,這個正則表達式不會工作。最好的方法是使用DOM而不是使用正則表達式。

0

嘗試[^(<a\W*class="bc\-de fg"\W*>)+(</a>)+]您可以使用不是^運算符。

相關問題