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)
Najprostszym i najbardziej wytrzymałe sposób nie byłoby za pomocą wyrażenia regularnego. – FailedDev
@FailedDev Opieka, aby mi pokazać, jak (nie musi być taka sama funkcja)? – domino
Przekazujesz część html za pomocą $ string? Jak zdobyć ten ciąg? – FailedDev