Как преобразовать URL-адрес jsfiddle в код для вставки iframe с помощью RegEx? - PullRequest
0 голосов
/ 19 декабря 2018

Я хотел бы преобразовать URL-адреса jsfiddle в правильные встраивания iframe.

Примеры URL-адресов:

https://jsfiddle.net/kai_noack/Lc78dr3y
https://jsfiddle.net/kai_noack/Lc78dr3y/
https://jsfiddle.net/kai_noack/h1jf34za/11
https://jsfiddle.net/kai_noack/h1jf34za/11/

И игнорировать:

https://jsfiddle.net
https://jsfiddle.net/
https://jsfiddle.net/kai_noack
https://jsfiddle.net/kai_noack/

Что я использую примомент, см. также Regex101: https://regex101.com/r/MEHrKO/1

$types = array(
    'jsfiddle' => array(
        array(
            'https{0,1}:\/\/w{0,3}\.*jsfiddle\.net\/([A-Za-z0-9_-]+)[^< ]*',
            '<div class="jsfiddle-embed-wrap"><iframe class="iframe-jsfiddle" src="//jsfiddle.net/$1/embedded/result,js,html,css/"></iframe></div>'
        ),
    ),
    // youtube, replit, ...
}

foreach($types as $t  => $ra) {
    // $t is youtube, jsfiddle, replit
    // $ra is array with replacements $ra[0] regex, $ra[1] embed code
    foreach($ra as $r) {
        $text = preg_replace('/<a[^>]+>'.$r[0].'<\/a>/i', $r[1], $text);
        $text = preg_replace('/(?<![\'"=])'.$r[0].'/i', $r[1], $text);
    }
}

Но он не работает с кодом выше, я получаю только часть строки kai_noack:

<div class="jsfiddle-embed-wrap"><iframe class="iframe-jsfiddle" src="//jsfiddle.net/kai_noack/embedded/result,js,html,css/">

Может быть, $1 это проблема?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

В соответствии с вашими примерами вы можете использовать

\Qhttps://jsfiddle.net/kai_noack/\E\S+

Это соответствует всем вашим желаемым URL при игнорировании других, см. демонстрацию на regex101.com .

0 голосов
/ 19 декабря 2018

Ваш шаблон застревает на kai_noack, потому что в вашем классе персонажей нет /: [A-Za-z0-9_-].

Если я не пойму вопрос неправильно, вам понадобятся только идентификатор скрипки и номер версии(и игнорируйте все перед именем пользователя).

Демонстрация паттернов

Код: ( Демонстрация )

$types = array(
    'jsfiddle' => array(
        array(
            'https?:\/\/(?:www)?\.?jsfiddle\.net[\w\/-]*\/([a-z\d]{8}(?:\/\d+)?)\/?',
            '<div class="jsfiddle-embed-wrap"><iframe class="iframe-jsfiddle" src="//jsfiddle.net/$1/embedded/result,js,html,css/"></iframe></div>'
        ),
    ),
    // youtube, replit, ...
);

$text = 'https://jsfiddle.net/kai_noack/h1jf34za/11/';

foreach($types as $t  => $ra) {
    // $t is youtube, jsfiddle, replit
    // $ra is array with replacements $ra[0] regex, $ra[1] embed code
    foreach($ra as $r) {
        $text = preg_replace('/<a[^>]+>'.$r[0].'<\/a>/i', $r[1], $text);
        $text = preg_replace('/(?<![\'"=])'.$r[0].'/i', $r[1], $text);
    }
}
echo $text;

Вывод:

<div class="jsfiddle-embed-wrap"><iframe class="iframe-jsfiddle" src="//jsfiddle.net/h1jf34za/11/embedded/result,js,html,css/"></iframe></div>

У ваших шаблонов уже есть модификаторы i, поэтому [A-Z] не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...