2013-02-21 78 views
4

我試圖從下面一行中獲取「img」標籤結束和「關閉」標籤之間的字符串(你好,我是來自img標籤之後) 。匹配「img」標籤和「alt」標籤和行號之間的字符串

<a href="products.html><img src="image.jpg" alt="alt value">hello i am from after img tag</a> 

然後檢查看他們是否匹配。同時我想找出該行的編號。 我已經嘗試了下面的代碼,它給了我一個網頁的行號和行。

 $dom = new domDocument; 
     $dom->loadHTMLFile('http://www.google.com'); 
     $dom->preserveWhiteSpace = true; 
     $dom->formatOutput = true; 
     $new = htmlspecialchars($dom->saveHTML(), ENT_QUOTES); 
     $lines = preg_split('/\r\n|\r|\n/', $new); 
     foreach ($lines as $lineNumber => $line) { 
     echo $lineNumber . \r\r. $line; 
     } 

以下代碼給出了圖像源和alt標記。我無法獲取行號或「img」標記結尾和「a」標記之間的文本(您好,我是來自img標記之後的)。

$alts = array(); 
$tags = $dom->getElementsByTagName('img'); 
foreach($tags as $tag) { 
    $alts[$tag->attributes->getNamedItem('src')->nodeValue] 
      = $tag->attributes->getNamedItem('alt')->nodeValue; 
} 
foreach($alts as $key => $alt) { 
    echo "{$key} => {$alt}<br/>"; 
} 

我知道正則表達式不適用於html解析,但我也嘗試過,看看它是否適用於以下行。 $ ALT =「你好,我是從的img標籤 後」 的正則表達式我已經是, //內ALT什麼

preg_match_all('|\s*alt[^>]*=[\'"](.*?)[\'"]|i', $alt, $altTag); 
「IMG」標籤,並關閉「」標籤的結束之間

//什麼。

preg_match_all("#<\s*a[^>]*><\s*img[^>]*>(.*?)<\s*/\s*a>#s", $alt, $foo); 

它完美的作品這樣,但是當試圖利用對變量$線相同的正則表達式(從上面的代碼),那麼它不給我任何東西。 任何人都可以幫助我。我真的需要做這個工作。感謝

回答

1

試試吧

$str = '<a href="products.html><img src="image.jpg" alt="alt value">hello i am from after img tag</a>'; 
preg_match_all('#<a[^>]+>(.*)</a>#isU', $str, $match); 
$result = array_map('strip_tags', $match[1]); 
print_r($result); 
+0

謝謝,但正則表達式我有它適用於你在那裏提到的單個字符串。它不適用於變量$ line($ line變量來自我頂部放置的示例) – ron 2013-02-21 14:12:42

+0

但是,您可以在不使用DOM文檔的情況下執行此操作,像這樣 preg_match_all('#] +>(。*)# isU',file_get_contents('http://www.google.com'),$ matches); $ matches = array_map('strip_tags',$ matches [1]); print_r($ matches [1]); – Winston 2013-02-21 14:22:18

2

在你使用正則表達式的情況下是不是一個好主意,但如果你真的想使用它,那麼你需要改變你的foreach循環。這裏是代碼。

foreach ($lines as $lineNumber => $l){ 
$line= html_entity_decode($l); 
} 

現在你可以申請regExp找到你想要的。