PHP: Mit regulären Ausdrücken die YouTube-ID in einem String finden

Mit der DSGVO sind einige Dinge ins Rollen gebracht worden. Eines dieser Dinge ist bspw. die Einbindung von YouTube-Videos. Der Nutzer muss vor der Einbindung eines Videos immer erst zustimmen, dass etwas eingebunden werden soll. Nützlich ist hier das Finden von YouTube-Links, um diese dann in einen Shortcode umzuwandeln. In diesem Beitrag findest du einen Ausdruck, mit dem du die IDs in einem String findest.

IDs finden

[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)

Dies kannst du verwenden, um bspw. mit preg_match oder preg_raplace alle IDs zu erhalten, die in einem String sind.

Beispiel: regex101

IDs finden, die nicht in einem Link sind

<a.*?<\/a>(*SKIP)(*F)|[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)Code-Sprache: JavaScript (javascript)

Mit diesem Ausdruck werden nur die IDs zurückgegeben, die nicht in einem a-Tag sind. Das ist vorwiegend bei einem preg_replace nützlich, der dann alle Links mit einem iframe ersetzen soll. So werden dann auch wirklich nur die Links ersetzt, die nicht in einem a-Tag sitzen.

Beispiel: regex101

YouTube-Shortcode für WordPress

add_shortcode('youtube', function ($atts, $content) {
    $replaced = false;

    if (false === strpos($content, 'http')) {
        $replaced = true;
        $content = 'https://www.youtube.com/embed/' . $content;
    }

    if (false === $replaced) {
        parse_str( parse_url( $content, PHP_URL_QUERY ), $params );

        if (isset($params['v'])) {
            $content = 'https://www.youtube.com/embed/' . $params['v'];
        }
    }

    $result = sprintf(
        '<iframe width="948" height="533" src="%s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>',
        $content
    );

    return $result;
});Code-Sprache: PHP (php)

Mit diesem Code lässt sich jetzt ein YouTube-Link in ein iFrame verwandeln, wenn du den Link in den Shortcode [[youtube][/youtube]] setzt.

Alle YouTube-Links im Inhalt mit Shortcode ersetzen

add_filter('the_content', function ($content) {
    $regex = "/\s*<a.*?<\/a>(*SKIP)(*F)|[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i";
    return preg_replace($regex, '[[youtube]$2[/youtube]]', $content);
});Code-Sprache: PHP (php)

Jetzt werden alle YouTube-Links, die nicht in einem a-Tag stecken, mit dem Shortcode ersetzt, der dann das Video einbettet. Du kannst das jetzt noch anpassen, um es mit deinem Cookie-Plugin umzuwandeln. Hier ein Beispiel für Borlabs:

add_filter('the_content', function ($content) {
    $regex = "/\s*<a.*?<\/a>(*SKIP)(*F)|[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i";
    return preg_replace($regex, '[[borlabs-cookie type="content-blocker"][youtube]$2[/youtube][/borlabs-cookie]]', $content);
});Code-Sprache: PHP (php)

Jetzt werden alle Links ersetzt, ein YouTube-Video eingebettet und der Borlabs-Shortcode eingesetzt, damit zuerst ein Inhaltsblockierer erscheint, bevor das Video geladen wird.

[borlabs-cookie type=“content-blocker“][youtube]https://www.youtube.com/watch?v=dEru8lRHuLo[/youtube][/borlabs-cookie]