2010-02-01 50 views
10

Tôi đang cố chạy preg_match để trích xuất thuộc tính SRC từ thẻ IMG đầu tiên trong một bài viết (trong trường hợp này, được lưu trong $ row-> introtext).Kết hợp thuộc tính SRC của thẻ IMG bằng cách sử dụng preg_match

preg_match('/\< *[img][^\>]*[src] *= *[\"\']{0,1}([^\"\']*)/i', $row->introtext, $matches); 

Thay vì nhận được một cái gì đó giống như

images/stories/otakuzoku1.jpg 

từ

<img src="images/stories/otakuzoku1.jpg" border="0" alt="Inside Otakuzoku's store" /> 

tôi nhận được chỉ

0 

Các regex nên thể đúng, nhưng tôi không thể nói lý do tại sao nó xuất hiện để phù hợp với attribu biên giới te và không phải thuộc tính src. Ngoài ra, nếu bạn đã kiên nhẫn đọc nó từ xa mà không bỏ qua trường trả lời và gõ 'sử dụng trình phân tích cú pháp HTML/XML', có thể là một hướng dẫn tốt cho một đề xuất khi tôi gặp khó khăn trong việc tìm kiếm một cái có thể áp dụng cho PHP 4.

PHP 4.4.7

Trả lời

28

Biểu thức của bạn không chính xác. Hãy thử:

preg_match('/< *img[^>]*src *= *["\']?([^"\']*)/i', $row->introtext, $matches); 

Lưu ý việc xóa dấu ngoặc xung quanh img và src và một số dọn dẹp khác.

+1

này đã làm các trick. Không phải là giải pháp 'lý tưởng' thực sự phân tích cú pháp HTML, mà là một giải pháp hoạt động và đưa ra kết quả cần thiết. Cảm ơn! – KyokoHunter

+2

dưới dạng ghi chú bên, $ match [0] chứa thẻ IMG đầy đủ và $ match [1] chứa URI nguồn. –

2

Hãy thử:

include ("htmlparser.inc"); // from: http://php-html.sourceforge.net/ 

$html = 'bla <img src="images/stories/otakuzoku1.jpg" border="0" alt="Inside Otakuzoku\'s store" /> noise <img src="das" /> foo'; 

$parser = new HtmlParser($html); 

while($parser->parse()) { 
    if($parser->iNodeName == 'img') { 
     echo $parser->iNodeAttributes['src']; 
     break; 
    } 
} 

mà sẽ tạo ra:

images/stories/otakuzoku1.jpg 

Nó sẽ làm việc với PHP 4.x.

+0

+1, tốt đẹp nhất, tôi đã chỉ từ ngữ một cái gì đó để có hiệu lực bằng cách sử dụng trình phân tích cú pháp DOM cũ :) – karim79

+0

Có vẻ hữu ích - sẽ cung cấp cho nó một thử và báo cáo lại ở đây. – KyokoHunter

+0

Một số vấn đề khi htmlparser.inc hoạt động. Thông báo lỗi cho biết lớp đã được bắt đầu, nhưng nó không phải là. Tôi sẽ giữ cho một nhà cung cấp nâng cấp lên PHP 5 ... – KyokoHunter

5

Đây là một cách để làm điều đó với built-in chức năng (php> = 4):

$parser = xml_parser_create(); 
xml_parse_into_struct($parser, $html, $values); 
foreach ($values as $key => $val) { 
    if ($val['tag'] == 'IMG') { 
     $first_src = $val['attributes']['SRC']; 
     break; 
    } 
} 

echo $first_src; // images/stories/otakuzoku1.jpg 
1

Các regex tôi sử dụng là đơn giản hơn nhiều. Mã của tôi giả định rằng các chuỗi được truyền cho nó chứa chính xác một thẻ img không có đánh dấu khác:

$pattern = '/src="([^"]*)"/'; 

Xem câu trả lời của tôi ở đây để biết thêm: How to extract img src, title and alt from html using php?

+0

"đúng một thẻ img không có đánh dấu khác"? Đó là một trường hợp khá cụ thể không phải là nó, có thể hơi quá cụ thể đối với hầu hết mọi người: [ – Andrew

1

Nếu bạn cần phải sử dụng preg_match() bản thân, cố gắng này :

preg_match('/(?<!_)src=([\'"])?(.*?)\\1/',$content, $matches); 
Các vấn đề liên quan