2011-11-19 8 views
6

Ta funkcja osadza filmy youtube, jeśli znajdują się w ciągu znaków.Zastąp adres URL w YouTube tekstem za pomocą kodu HTML do umieszczenia na stronie

Moje pytanie brzmi: jaki byłby najłatwiejszy sposób przechwycenia tylko osadzonego wideo (iframe i tylko pierwszego, jeśli jest ich więcej) i zignorowania pozostałej części łańcucha.

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

Najprostszym i najbardziej wytrzymałe sposób nie byłoby za pomocą wyrażenia regularnego. – FailedDev

+0

@FailedDev Opieka, aby mi pokazać, jak (nie musi być taka sama funkcja)? – domino

+0

Przekazujesz część html za pomocą $ string? Jak zdobyć ten ciąg? – FailedDev

Odpowiedz

13

Okej, myślę, że widzę, co próbujesz osiągnąć. Użytkownik wprowadza blok tekstu (jakiś komentarz lub cokolwiek innego) i znajduje URL YouTube w tym tekście i zastępuje go faktycznym kodem do osadzenia wideo.

Oto jak mam go modyfikować:

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); 
} 

Skoro jesteś już lokalizowania URL z pierwszym preg_match(), nie ma potrzeby, aby uruchomić inną funkcję regex do zastąpienia go. Dopasuj cały adres URL, a następnie wykonaj prosty str_replace() z całego Twojego dopasowania ($match[0]). Kod wideo jest przechwytywany w pierwszym podtekście ($match[1]). Używam preg_match(), ponieważ chcesz tylko dopasować pierwszy znaleziony URL. Będziesz musiał użyć preg_match_all() i nieco zmodyfikować kod, jeśli chcesz dopasować wszystkie adresy URL, a nie tylko pierwsze.

Oto wyjaśnienie mojego wyrażenia regularnego:

(?: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

Szukałem tego skryptu w całej sieci. Ta działa, ale wykrywa tylko pierwszy URL w treści. Na przykład mam 3 URL-e z youtube w treści. Pierwsze wideo zostanie osadzone, a pozostałe po prostu wyświetlają linki. Co mam zrobić? – Wilf

+0

Mam to! Po prostu zmień 'preg_match' na' preg_match_all' ... Dzięki za miliony! – Wilf

+0

Mam to działa: http://stackoverflow.com/a/5452862/1620626 – Wilf

Powiązane problemy