Đượ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)
Cách đơn giản nhất và mạnh mẽ nhất sẽ không sử dụng một regex. – FailedDev
@FailedDev Chăm sóc để chỉ cho tôi cách (không phải là chức năng giống nhau)? – domino
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