我多年来一直试图理解正则表达式无济于事!
我有一个系统(让我们说它是一个清晰的论坛)用户可以发布文本等,他们可以发布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,然后将其转换为可以在以后替换的字符串。然而,令我沮丧的无法理解正则表达式导致没有任何事情发生!我该怎么做?
答案 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并阻止了替换后的内容。