Как преобразовать URL-адрес jsfiddle в код для встраивания iframe с помощью RegEx?

Я хотел бы преобразовать 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 это проблема?

0

Решение

Ваша модель застревает на 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] не обязательно.

1

Другие решения

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

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

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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector