2011-11-19 34 views
6

Chức năng này nhúng video youtube nếu tìm thấy trong chuỗi.Thay thế URL YouTube bằng văn bản bằng mã nhúng HTML

Câu hỏi của tôi là cách dễ nhất để chỉ chụp video được nhúng (khung nội tuyến và chỉ lần đầu tiên nếu có nhiều hơn) và bỏ qua phần còn lại của chuỗi.

function youtube($string,$autoplay=0,$width=480,$height=390) 
{ 
preg_match('#(v\/|watch\?v=)([\w\-]+)#', $string, $match); 
    return preg_replace(
    '#((http://)?(www.)?youtube\.com/watch\?[=a-z0-9&_;-]+)#i', 
    "<div align=\"center\"><iframe title=\"YouTube video player\" width=\"$width\" height=\"$height\" src=\"http://www.youtube.com/embed/$match[2]?autoplay=$autoplay\" frameborder=\"0\" allowfullscreen></iframe></div>", 
    $string); 
} 
+0

Cách đơn giản nhất và mạnh mẽ nhất sẽ không sử dụng một regex. – FailedDev

+0

@FailedDev Chăm sóc để chỉ cho tôi cách (không phải là chức năng giống nhau)? – domino

+0

Bạn đang chuyển một phần của html bằng chuỗi $ phải không? Làm thế nào để bạn có được chuỗi đó? – FailedDev

Trả lời

13

Được rồi, tôi nghĩ tôi thấy những gì bạn đang cố gắng hoàn thành. Người dùng nhập một khối văn bản (một số nhận xét hoặc bất kỳ nội dung nào) và bạn tìm thấy URL YouTube trong văn bản đó và thay thế bằng mã nhúng video thực tế.

Đây là cách tôi đã sửa đổi nó:

function youtube($string,$autoplay=0,$width=480,$height=390) 
{ 
    preg_match('#(?:http://)?(?:www\.)?(?:youtube\.com/(?:v/|watch\?v=)|youtu\.be/)([\w-]+)(?:\S+)?#', $string, $match); 
    $embed = <<<YOUTUBE 
     <div align="center"> 
      <iframe title="YouTube video player" width="$width" height="$height" src="http://www.youtube.com/embed/$match[1]?autoplay=$autoplay" frameborder="0" allowfullscreen></iframe> 
     </div> 
YOUTUBE; 

    return str_replace($match[0], $embed, $string); 
} 

Vì bạn đã định vị các URL với preg_match() đầu tiên, không có cần phải chạy một chức năng regex để thay thế nó. Làm cho nó khớp với toàn bộ URL, sau đó thực hiện một đơn giản str_replace() của toàn bộ kết quả phù hợp của bạn ($match[0]). Mã video được ghi trong mẫu con đầu tiên ($match[1]). Tôi đang sử dụng preg_match() vì bạn chỉ muốn khớp với URL đầu tiên được tìm thấy. Bạn sẽ phải sử dụng preg_match_all() và sửa đổi mã một chút nếu bạn muốn khớp tất cả các URL, không chỉ là URL đầu tiên.

Dưới đây là một lời giải thích của biểu thức chính quy của tôi:

(?:http://)? # optional protocol, non-capturing 
(?:www\.)?  # optional "www.", non-capturing 
(?: 
       # either "youtube.com/v/XXX" or "youtube.com/watch?v=XXX" 
    youtube\.com/(?:v/|watch\?v=) 
    | 
    youtu\.be/  # or a "youtu.be" shortener URL 
) 
([\w-]+)  # the video code 
(?:\S+)?  # optional non-whitespace characters (other URL params) 
+0

Tôi đã tìm kiếm tập lệnh này trên mạng. Điều này hoạt động nhưng nó chỉ phát hiện url đầu tiên trong nội dung. Ví dụ: tôi có 3 url youtube trong nội dung. Video đầu tiên sẽ nhúng trong khi các video khác chỉ hiển thị liên kết. Tôi nên làm gì? – Wilf

+0

Tôi đã hiểu! Chỉ cần thay đổi 'preg_match' thành' preg_match_all' ... Cảm ơn hàng triệu! – Wilf

+0

Tôi đã làm việc này: http://stackoverflow.com/a/5452862/1620626 – Wilf

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