2011-09-20 36 views
22

Tôi đang cố gắng tải hình ảnh đầu tiên từ mỗi bài đăng của mình. Mã này bên dưới hoạt động tốt nếu tôi chỉ có một hình ảnh. Nhưng nếu tôi có nhiều hơn thì nó mang lại cho tôi một hình ảnh nhưng không phải lúc nào cũng là hình ảnh đầu tiên.Lấy hình ảnh đầu tiên bằng chuỗi php

Tôi thực sự chỉ muốn hình ảnh đầu tiên. Rất nhiều lần hình ảnh thứ hai là một nút bên cạnh

$texthtml = 'Who is Sara Bareilles on Sing Off<br> 
<img alt="Sara" title="Sara" src="475993565.jpg"/><br> 
<img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 

preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $texthtml, $matches); 
$first_img = $matches [1] [0]; 

bây giờ tôi có thể thực hiện việc này "$ first_img" và dính nó ở phía trước của mô tả ngắn

<img alt="Sara" title="Sara" src="<?php echo $first_img;?>"/> 

Trả lời

38

Nếu bạn chỉ cần thẻ nguồn đầu tiên, preg_match nên làm thay vì preg_match_all, làm việc này cho bạn?

<?php 
    $texthtml = 'Who is Sara Bareilles on Sing Off<br> 
    <img alt="Sara" title="Sara" src="475993565.jpg"/><br> 
    <img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 
    preg_match('/<img.+src=[\'"](?P<src>.+?)[\'"].*>/i', $texthtml, $image); 
    echo $image['src']; 
?> 
+1

Thật lạ, tôi đã thay thế nó bằng mã của bạn và Im vẫn nhận được hình ảnh thứ hai – MHowey

+0

Bạn có thể dán vào đây html không, vì Kelsey cho biết mã của bạn cũng nên hoạt động để dễ theo dõi hơn. ví dụ thất bại. – derp

+12

Mã của bạn có quá tham lam không? Vì vậy, nếu thẻ alt xuất hiện sau src, nó cũng sẽ ghi lại. Bạn cần '+?' Thay vì '+'. Vì vậy, bạn có: 'preg_match ('/ . +?) [\'"]. *>/I ', $ texthtml, $ image); ' –

1

Bạn có chắc chắn regex luôn là phù hợp với cái đầu tiên? Thử in mảng mỗi khi bạn gọi nó là để xem:

error_log(var_export($matches, true));

+0

Thats vấn đề của tôi. Nó luôn luôn trả về một hình ảnh nhưng tôi cần nó để trả lại hình ảnh đầu tiên chỉ – MHowey

+0

Vâng mã của bạn trông giống như nó sẽ làm việc (tôi đã không kiểm tra regex mặc dù). Bạn đang truy cập mảng thứ hai, chứa các mẫu đã chụp, và sau đó là phần tử đầu tiên trong mảng đó, là hình ảnh đầu tiên. Bạn đã thử in toàn bộ mảng đó ra và đảm bảo rằng khi bạn nhìn thấy hình ảnh sai, hình ảnh đầu tiên cũng khớp với nhau? Tôi cá là không. –

5

Không sử dụng regex để phân tích cú pháp html. Sử dụng html-phân tích lib/lớp, như phpquery:

require 'phpQuery-onefile.php'; 

$texthtml = 'Who is Sara Bareilles on Sing Off<br> 
<img alt="Sarahehe" title="Saraxd" src="475993565.jpg"/><br> 
<img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 
$pq = phpQuery::newDocumentHTML($texthtml); 
$img = $pq->find('img:first'); 
$src = $img->attr('src'); 
echo "<img alt='foo' title='baa' src='{$src}'>"; 

Download: http://code.google.com/p/phpquery/

+1

Cảm ơn, nhưng điều cuối cùng tôi muốn là thêm một tấn mã để khắc phục sự cố hình ảnh nhỏ.preg_match là tốt cho một vài dòng html được gọi từ sql. Nhưng cảm ơn bạn đã dành thời gian để trả lời – MHowey

+1

có, có thể tấn mã nhưng trong câu hỏi hiệu suất, phpQuery là nhanh hơn nhiều nếu so sánh với các biểu thức thông thường. –

+0

Tôi sẽ đồng ý trong hầu hết các trường hợp. Nhưng đây là một blog nhỏ hiển thị 5 hình ảnh trên mỗi trang. Tôi sẽ ghi nhớ ý kiến ​​của bạn. Và tôi thực sự cảm ơn bạn vì nó / – MHowey

2

Sau khi thử nghiệm một câu trả lời từ đây Using regular expressions to extract the first image source from html codes? tôi nhận kết quả tốt hơn với những hình ảnh liên kết ít bị hỏng hơn so với câu trả lời cung cấp ở đây.

Mặc dù cụm từ thông dụng có thể tốt cho nhiều tác vụ khác nhau nhưng tôi thấy nó thường thiếu khi phân tích cú pháp HTML DOM. Vấn đề với HTML là cấu trúc của tài liệu của bạn quá biến đến mức khó chính xác (và chính xác là tôi có nghĩa là 100% tỷ lệ thành công không có kết quả dương tính giả) trích xuất một thẻ.

Để có kết quả nhất quán hơn, hãy sử dụng đối tượng này http://simplehtmldom.sourceforge.net/ cho phép bạn thao tác html. Một ví dụ được cung cấp trong phản hồi trong liên kết đầu tiên tôi đăng.

function get_first_image($html){ 
require_once('SimpleHTML.class.php') 

$post_html = str_get_html($html); 

$first_img = $post_html->find('img', 0); 

if($first_img !== null) { 
    return $first_img->src'; 
} 

return null; 
} 

Thưởng thức

Các vấn đề liên quan