regex — автоматически обнаруживает и вставляет ссылки MP4 / MP3 в html-контент, используя переполнение стека

Я пишу простой блог для своего сайта, и мне это удалось.

function convertYoutube($string, $id='') {
return preg_replace(
"/\s*[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i",
"<div class=videoWrapper><iframe style=\"clear:both;\" width=\"420\" height=\"315\" src=\"//www.youtube.com/embed/$2\" allowfullscreen></iframe></div>
",
$string
);
}

Это преобразование URL-адреса YouTube (короткого или длинного) в форму для встраивания.

Теперь то, что я хочу сделать, это:

  • конвертировать mp4 ссылки, например:
    http://cdn.example.com/akndh39/2016/askbdsjdbuu/my-video.mp4?id=28gsbd0mu&d=33hfsbb

    в

    <video width="320" height="240" controls>
    <source src="movie.mp4" type="video/mp4">
    </video>

  • конвертировать mp3 ссылки в эквивалентный формат тегов

Однако я не хочу конвертировать ссылки, подобные этой

<a href="http://cdn.example.com/akndh39/2016/askbdsjdbuu/my-video.mp4">DOWNLOAD VIDEO</a>

Я хочу, чтобы они оставались такими же, как для mp4, так и для mp3-ссылок.

РЕДАКТИРОВАНИЕ

Что я хочу это:

This is a very nice Video by Artiste So-n-So    https://scontent.cdninstagram.com/t50.2886-16/13229628_1095069080586346_1424116369_n.mp4

<a href="http://cdn.example.com/akndh39/2016/askbdsjdbuu/my-video.mp4?id=28gsbd0mu&d=33hfsbb">
Download Video</a>

введите описание изображения здесь

This is a very nice Video by Artiste So-n-So     <video width="320" height="240" controls>
<source src="https://scontent.cdninstagram.com/t50.2886-16/13229628_1095069080586346_1424116369_n.mp4" type="video/mp4">
</video>

<a href="http://cdn.example.com/akndh39/2016/askbdsjdbuu/my-video.mp4?id=28gsbd0mu&d=33hfsbb">
Download Video</a>

2

Решение

Это регулярное выражение найдет URL-адреса mp4:

(["\']?https?:\/\/[^\/]+(?:\/[^\/]+)*?.mp4\?(&?\w+(=[^&\'"\s]*)?)*)

После этого есть некоторый PHP-код для замены URL тегами video и source. Обратите внимание, что теперь он захватывает начальные символы кавычек, чтобы определить, содержится ли URL в href="" или же src="" ссылка на сайт; приведенный ниже код явно проверяет это и пропускает найденные URL-адреса, начинающиеся с кавычек. Посмотрите второй URL в первом примере, чтобы увидеть, как это работает.

Вот пример кода, использующего URL для выделения автономных URL MP4 из текста:

$subject = <<<LABEL
This is a very nice Video by Artiste So-n-So    https://s...content-available-to-author-only...m.com/t50.2886-16/13229628_1095069080586346_1424116369_n.mp4<a href="http://c...content-available-to-author-only...e.com/akndh39/2016/askbdsjdbuu/my-video.mp4?id=28gsbd0mu&d=33hfsbb">
Download Video</a>"LABEL;

$subject = <<<LABEL
Please one more thing, can you expand your regex to include URLs like these.
https://z-1-scontent-lhr3-1.xx.fbcdn.net/v/t42.1790-4/13226507_264732453878764_‌​308543824_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InN2ZV9zZCJ9&oh=c68eadae7d9a5b25ad290ea72‌​3f8fc40&oe=57378FA2
that is URLs that doesn't end immediately with the extension, but have other parameters added to it.
LABEL;

$pattern = '(["\']?https?:\/\/[^\/]+(?:\/[^\/]+)*?.mp4\?(&?\w+(=[^&\'"\s]*)?)*)';
$matches = Array();
$match = preg_match($pattern, $subject, $matches);

if (count($matches) !== 0) {
$first_char = substr($matches[0], 0, 1);
if ($first_cahr !== '"' && $first_char !== "'") {
$replace = '<video width="320" height="240" controls><source src="' . $matches[0] . '" type="video/mp4"></video>';

$result = str_replace($matches[0], $replace, $subject);

print_r($result);
}
}

Выход для первого контрольного примера:

Success time: 0.03 memory: 52480 signal:0
This is a very nice Video by Artiste So-n-So    <video width="320" height="240" controls><source src="https://scontent.cdninstagram.com/t50.2886-16/13229628_1095069080586346_1424116369_n.mp4" type="video/mp4"></video><a href="http://cdn.example.com/akndh39/2016/askbdsjdbuu/my-video.mp4?id=28gsbd0mu&d=33hfsbb">
Download Video</a>"

Выход для второго контрольного примера:

Please one more thing, can you expand your regex to include URLs like these.
<video width="320" height="240" controls><source src="https://z-1-scontent-lhr3-1.xx.fbcdn.net/v/t42.1790-4/13226507_264732453878764_‌​308543824_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InN2ZV9zZCJ9&oh=c68eadae7d9a5b25ad290ea72‌​3f8fc40&oe=57378FA2" type="video/mp4"></video>
that is URLs that doesn't end immediately with the extension, but have other parameters added to it.
3

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

Других решений пока нет …

По вопросам рекламы [email protected]