Я хотел бы преобразовать 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
это проблема?
Ваша модель застревает на 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]
не обязательно.
Согласно вашим примерам вы можете использовать
\Qhttps://jsfiddle.net/kai_noack/\E\S+
Это соответствует всем вашим желаемым URL, игнорируя другие, см. демо на regex101.com.