2013-03-10 207 views
1

我一直在嘗試使用preg_match_all 30分鐘,但看起來我無法做到。從preg_match_all字符串中提取img src

基本上我有一個$var其中包含一個HTML代碼的字符串。例如:

<br>iihfuhuf 
<img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg" 
src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"> 
<img src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"><br> 

我想要得到的含有/temp/temp[a-z0-9]{13}\.jpeg他們src價值img標籤src屬性值。

這是我到目前爲止有:

preg_match_all('!(<img.*src=".*/temp/temp[a-z0-9]{13}\.jpeg"(.*alt=".*")?>)!', $content, $matches); 
+4

你嘗試過30分鐘...你有什麼想出什麼沒有工作? – 2013-03-10 16:13:12

+0

preg_match_all('!!',$ content,$ matches);我只是不太明白preg_match_all是如何工作的。我可以製作這個模式,但不能讓preg_match_all像我期望的那樣工作。 – 2013-03-10 16:15:09

+1

@MarcDupuis您應該爲此使用DOM和XPath,而不是(僅)正則表達式。使用包含'/ temp/temp'的'src'將HTML加載到''DOMDocument''(http://php.net/domdocument)和''標記的XPath中,並且您可以輕鬆地迭代匹配的節點並使用正則表達式來提取您需要的數據。你甚至可以用XPath註冊PHP函數,直接在XPath查詢中使用你的regex。 – DaveRandom 2013-03-10 16:18:37

回答

6
<img[^>]*src="([^"]*/temp/temp[a-z0-9]{13}\.jpeg)" 

<img[^>]*選擇IMG標籤

src="([^"]*)"得到SRC值,並將其保存爲比賽

/temp/temp[a-z0-9]{13}\.jpeg是SRC濾波器值

Fo [R快速正則表達式測試使用像http://regexpal.com/

+0

很好,謝謝 – 2013-03-10 16:18:46

+1

你應該逃離點'\ .' – 2013-03-10 16:19:45

+0

你也應該逃避第二個「in src =」([^「] *)」 – Medhi 2013-12-12 11:16:02

0

一些在線工具試試這個:

preg_match_all('/src="([^"]+temp[a-z0-9]{13}\.jpeg)"/',$url,$matches); 

var_dump($matches); 
1

所有你需要做的就是添加另一組到你的正則表達式。你有杜環繞你想從比賽提取與括號一切:

preg_match_all('!(<img.*src="(.*/temp/temp[a-z0-9]{13}\.jpeg)"(.*alt=".*")?>)!', $content, $matches); 

你可以看到,工作here。您可以在$matches[2]中找到這些網址。

但只是說了:正則表達式是沒有合理的方法來從HTML中提取任何東西。你最好使用DOMDocument,XPath或其他的東西。

0
<?php 
$text = '<br>iihfuhuf<img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg" src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"><img src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"><br>'; 
$pattern = '#src="([^"]+/temp/temp[a-z0-9]{13}\.jpeg)"#'; 
preg_match_all($pattern, $text, $out); 
echo '<pre>'; 
print_r($out); 
?> 

Array 
(
    [0] => Array 
     (
      [0] => src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg" 
      [1] => src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg" 
     ) 

    [1] => Array 
     (
      [0] => http://www.jlnv2.local/temp/temp513caca536fcd.jpeg 
      [1] => http://www.jlnv2.local/temp/temp513caca73b8da.jpeg 
     ) 

) 
0

這裏是如何做到這一點一DOMDocument/DOMXPath基於例子。這可以說是唯一正確的方法,因爲除非你很擅長正則表達式,否則很可能總是存在會破壞邏輯的邊緣情況。

$doc = new DOMDocument; 
$xpath = new DOMXPath($doc); 

$doc->loadHTML($content); 

$candidates = $xpath->query("//img[contains(@src, '/temp/temp')]"); 

$result = array(); 
foreach ($candidates as $image) { 
    $src = $image->getAttribute('src'); 
    if (preg_match('/temp[0-9a-z]{13}\.jpeg$/', $src, $matches)) { 
    $result[] = $src; 
    } 
} 

print_r($result);