preg_replace youtube iframe

时间:2013-06-10 21:55:24

标签: regex preg-replace

我多年来一直试图理解正则表达式无济于事!

我有一个系统(让我们说它是一个清晰的论坛)用户可以发布文本等,他们可以发布youtube和soundcloud嵌入代码。我正在创建一个过滤器来清理提交的内容(以及使用htmlpurifier)。由于我们的网站是SSL,因此我想将嵌入代码格式化为https://并更改iframe的大小等。所以我要做的是捕获所有youtube和soundcloud iframe,将它们转换为标记,例如"%youtube_embed%=dhusydg",运行我的过滤器,杀死所有iframe等,然后根据我的格式构建youtube / soundcloud iframe嵌入。

所以这就是我的......那是行不通的!

$string = preg_replace('/<iframe width="420" height="315" src="http\:\/\/www.youtube.com\/embed\/(.*)" frameborder="0" allowfullscreen>\<\/iframe>/', '%youtube_embed%=$1', $string);

应该做的是找到任何标准的youtube嵌入代码,从网址中提取视频ID,然后将其转换为可以在以后替换的字符串。然而,令我沮丧的无法理解正则表达式导致没有任何事情发生!我该怎么做?

2 个答案:

答案 0 :(得分:1)

<?php
$string = '<iframe allowfullscreen frameborder="0" height="315"
src="youtube.com/embed/xxxx"; width="420"></iframe>
text
<iframe allowfullscreen frameborder="0" height="315" src="youtube.com/embed/xxxx"; width="420"></iframe> text';
$string = preg_replace(
'/<iframe.*?src="youtube.com\/embed\/(.*?)".*?<\/iframe>/si',
'%youtube_embed%=$1', $string);
print $string;

打印:

%youtube_embed%=xxxx
text
%youtube_embed%=xxxx text

我使用正则表达式的s和i修饰符来忽略换行符并使搜索不区分大小写:

http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

答案 1 :(得分:0)

感谢user4035的帮助,这使我朝着正确的方向前进。完成的代码是这样的;

    $string = '<iframe width="420" height="315" src="http://www.youtube.com/embed/xxxxxx"></iframe>';

    // immunize youtube iframe from filter
    $clean = preg_replace('/<iframe.*?src="http:\/\/www\.youtube\.com\/embed\/(.*)".*?\/iframe>/si','%youtube_embed%=$1',  html_entity_decode($string));
    // apply filtering here e.g removing non youtube iframes etc.

    // create youtube iframe to our own format e.g add class, convert to ssl and change player size etc
    $clean = preg_replace('/%youtube_embed%=(.*)/si','<iframe class="youtube" width="300" height="250" scrolling="no" frameborder="no" src="https://youtube.com/embed/$1"></iframe>',  $clean);
    echo $clean;

注意:“?”在通配符中(.*?)打破了所有内容,因此我更改为(.*)

EDIT 这仍然不起作用。它打破了HTML并阻止了替换后的内容。