2012-05-18 116 views
9

Tôi đang cố gắng sử dụng regex để thay thế thuộc tính nguồn (có thể là hình ảnh hoặc bất kỳ thẻ nào) trong PHP.Regex để thay thế thuộc tính src html trong PHP

Tôi đã một chuỗi như thế này:

$string2 = "<html><body><img src = 'images/test.jpg' /><img src = 'http://test.com/images/test3.jpg'/><video controls="controls" src='../videos/movie.ogg'></video></body></html>"; 

Và tôi muốn biến nó thành:

$string2 = "<html><body><img src = 'test.jpg' /><img src = 'test3.jpg'/><video controls="controls" src='movie.ogg'></video></body></html>"; 

Heres những gì tôi đã cố gắng:

$string2 = preg_replace("/src=["']([/])(.*)?["'] /", "'src=' . convert_url('$1') . ')'" , $string2); 
echo htmlentities ($string2); 

Về cơ bản nó đã không 't thay đổi bất cứ điều gì và đã cho tôi một cảnh báo về chuỗi không thoát.

Không $1 gửi nội dung của chuỗi? Có gì sai ở đây?

Và chức năng của convert_url là từ một ví dụ tôi đăng ở đây trước:

function convert_url($url) 
{ 
    if (preg_match('#^https?://#', $url)) { 
     $url = parse_url($url, PHP_URL_PATH); 
    } 
    return basename($url); 
} 

Đó là nghĩa vụ phải loại bỏ đường dẫn url và chỉ trả lại tên tập tin.

+0

chuỗi gốc và những gì bạn muốn biến thành cả hai chuỗi trống - có thiếu gì không? – ametren

+0

cố gắng thay thế "bằng \" – Mageek

+0

Chỉ cần chỉnh sửa lại. – Ashesh

Trả lời

1

Bạn phải sử dụng modifier e.

$string = "<html><body><img src='images/test.jpg' /><img src='http://test.com/images/test3.jpg'/><video controls=\"controls\" src='../videos/movie.ogg'></video></body></html>"; 

$string2 = preg_replace("~src=[']([^']+)[']~e", '"src=\'" . convert_url("$1") . "\'"', $string); 

Lưu ý rằng khi sử dụng modifier e, kịch bản đoạn thay cần phải là một chuỗi để ngăn chặn nó được giải thích trước khi cuộc gọi đến preg_replace.

13

Không sử dụng cụm từ thông dụng trên HTML - sử dụng lớp DOMDocument.

$html = "<html> 
      <body> 
      <img src='images/test.jpg' /> 
      <img src='http://test.com/images/test3.jpg'/> 
      <video controls='controls' src='../videos/movie.ogg'></video> 
      </body> 
     </html>"; 

$dom = new DOMDocument; 
libxml_use_internal_errors(true); 

$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
libxml_clear_errors(); 

$doc = $dom->getElementsByTagName("html")->item(0); 
$src = $xpath->query(".//@src"); 

foreach ($src as $s) { 
    $s->nodeValue = array_pop(explode("/", $s->nodeValue)); 
} 

$output = $dom->saveXML($doc); 

echo $output; 

Những kết quả đầu ra như sau:

<html> 
    <body> 
    <img src="test.jpg"> 
    <img src="test3.jpg"> 
    <video controls="controls" src="movie.ogg"></video> 
    </body> 
</html> 
+0

Lớp tài liệu dom không phải là rất hữu ích nếu nó là html nhúng bên trong một thẻ HTML khác như cho ví dụ: – Ashesh

+1

@Ashesh Tôi không theo tôi. Bạn đã cho chúng tôi thấy mã PHP - Tôi đang hiển thị cho bạn giải pháp. – Sampson

+0

Tôi xin lỗi tôi nên rõ ràng hơn. Dưới đây là những gì tôi đang nói về: "". Trong trường hợp này, domdocument sẽ không được lấy trên thẻ hình ảnh bên trong javascript. Đó là lý do tại sao tôi cần phải sử dụng regex. – Ashesh

1
function replace_img_src($img_tag) { 
    $doc = new DOMDocument(); 
    $doc->loadHTML($img_tag); 
    $tags = $doc->getElementsByTagName('img'); 
    foreach ($tags as $tag) { 
     $old_src = $tag->getAttribute('src'); 
     $new_src_url = 'website.com/assets/'.$old_src; 
     $tag->setAttribute('src', $new_src_url); 
    } 
    return $doc->saveHTML(); 
} 
Các vấn đề liên quan