2014-03-13 30 views
-1

我有一些HTML內容,我需要解析它,得到所有的圖像。然後打印出全部內容,但圖像PHP拆分字符串由<img>和中斷輸出

This is the content 

<?php $content = 'Some text 
<p>A paragraph</p> 
<img src="image1.jpg" width="200" height="200"> 
More text 
<img src="image2.jpg" width="200" height="200">'; ?> 

我需要能夠獲得的圖像和運行一個類的方法與輸出的每次出現運行PHP類實例。

所以結果會是這樣的

<?php echo 'Some text 
<p>A paragraph</p>'; 

$this->Image('image1.jpg', PDF_MARGIN_LEFT, $y_offset, 116, 85); 
echo 'More text'; 
$this->Image('image2.jpg', PDF_MARGIN_LEFT, $y_offset, 116, 85); 

但obviouly我想象它會是一個循環或東西做,它會自動

+1

此鏈接可能會幫助你http://stackoverflow.com/questions/10130858/get-img-src-with-php – Chitowns24

+0

Downvoting因爲你的問題沒有表現出任何努力來解決你的問題 - 你只是要求我們代碼給你。 –

+0

啊哈,我不知道從哪裏開始。無論如何@RobertRossmann GAL;) – Martin

回答

2

要將整個HTML片段轉換爲TCPDF正如你所提到在你的評論中,你需要用DOMDocument解析這個片段,然後遍歷每個子節點,決定如何正確處理它們。

<html> 
    <body> 
     Some text 
     <p>A paragraph</p> 
     <img src="image1.jpg" width="200" height="200"> 
     More text 
     <img src="image2.jpg" width="200" height="200"> 
    </body> 
</html> 

與您在上面提供的片段美中不足的是,它不是一個完整的HTML文檔,從而DOMDocument<html><body>標籤解析它的時候,內部裝載以下結構把它包

然而,這個警告很容易解決,通過建立在@ hakre的答案在我鏈接到下面的線程。我的建議是沿着以下線的東西:

// Load the snipped into a DOMDocument 
$doc = new DOMDocument(); 
$doc->loadHTML($content); 

// Use DOMXPath to retrieve the body content of the snippet 
$xpath = new DOMXPath($doc); 
$data = $xpath->evaluate('//html/body'); 

// <body> is now $data[0], so for readability we do this 
$body = $data[0]; 

// Now we loop through the elements in your original snippet 
foreach ($body->childNodes as $node) { 
    switch ($node->nodeName) { 
     case 'img': 
      // Get the value of the src attribute from the img element 
      $src = $node->attributes->getNamedItem('src')->nodeValue; 
      $this->Image($src, PDF_MARGIN_LEFT, $y_offset, 116, 85); 
      break; 
     default: 
      // Pass the line to TcPDF as a normal paragraph 
      break; 
    } 
} 

這樣,您就可以輕鬆地添加額外的case 'blah':塊來處理可能出現在你的$content片段,並適當地處理它們的其他元素,內容將是按照正確的順序進行處理,而不會破壞文本的原始流程。 :)

- 原始回答。如果你只是想提取圖像源並在其他地方獨立處理它們,它們將會起作用。

您可以通過使用正則表達式匹配所有在您$content字符串<img>標籤:

/<img(?:[\s\w="]+)src="([^"]+)"(?:[\s\w="]*)\/?>/i 

,你可以玩,看看它是如何工作的正則表達式的現場故障是在這裏:http://regex101.com/r/tS5xY9

您可以使用此正則表達式與preg_match_all()從您$content變量中檢索所有的圖像標籤如下:

$matches = array(); 
$num = preg_match_all('/<img(?:[\s\w="]+)src="([^"]+)"(?:[\s\w="]*)\/?>/i', $content, $matches, PREG_SET_ORDER); 

PREG_SET_ORDER恆定告訴preg_match_all()存儲其以這樣的方式的結果產生輸出時,其更容易通過環狀,作爲陣列上的第一索引(即,$matches[0]$matches[1]等)將包含完整的組匹配結果從正則表達式。在上述正則表達式的情況下,將$matches[0]包含以下內容:

array(
    0 => '<img src="image1.jpg" width="200" height="200">', 
    1 => 'image1.jpg', 
) 

您現在可以遍歷$matches$key => $match並通過$match[1]$this->Image()方法。

或者,如果不通過要循環,你可以直接從$matches訪問每個src屬性爲$matches[0][1]$matches[1][1]

如果您需要能夠給內訪問其他屬性標籤,那麼我建議您使用Get img src with PHP上的@hakre提供的DOMDocument方法。如果您只需要訪問src屬性,那麼使用preg_match_all()會更快更高效,因爲它不需要將片段的整個DOM作爲對象加載到內存中,以便爲您提供所需的數據。

+0

[爲什麼你不應該使用正則表達式來解析HTML](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/ 1732454#1732454) –

+0

太棒了! @TwoWholeWorms效果很好,但是我仍然需要一種每次有圖像時都要打破$內容的方法,執行Class方法,然後繼續輸出$ content。 我知道這看起來很亂,但不幸的是我正在與TcPDF合作 – Martin

+0

@PatrickQ,Martin:我誤解了這個問題。如果您只是想讓所有圖片來源忽略其餘的信息,我所給出的答案將會奏效。如果你想將它們與文本的其餘部分交錯,那麼你需要在整個塊上使用DOMParser,並通過每個節點分別循環決定如何處理它們。我馬上更新答案。 –

1

你可以建立一個lexerparser找出圖像的位置。

您正在尋找兩個標記開頭:<img和各自的結束>。一個起點可能是這樣的:

$text = "hello <img src='//first.jpg'> there <img src='//second.jpg'>"; 
$pos = 0; 

while (($opening = strpos($text, '<img', $pos)) !== FALSE) { 

    // Find the next closing bracket's location 
    $closing = strpos($text, '>', $opening); 
    $length = ($closing - $opening) + 1; // Add one for the closing '>' 

    $img_tag = substr($text, $opening, $length); 

    var_dump($img_tag); 

    // Update the loop position with our closing tag to advance the lexer 
    $pos = $closing; 
} 

你將不得不構建方法來掃描img標籤。您也可以在循環中添加您的PDF方法。

另一個更易於管理的方法可能是建立一個遍歷每個角色的類。它首先要查找一個開頭的「<」字符,然後檢查接下來的三個是否是'img',如果是,則分別進行掃描src,height,width屬性。這是更多的工作,但更靈活 - 你將能夠掃描遠遠超過你的圖像標籤。