我有一个正则表达式,我已经编写,以提取用户输入的值并替换一些高度和宽度值并保留网址。这样就可以安全地添加到数据库中。
这是我到目前为止(只是试图让preg_match返回一个TRUE值)
$test ='<object height="81" width="100%"> <param name="movie" value="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fsoundcloud.com%2Ftheshiverman%2Fsummer-beats-july-2010&secret_url=false"></param> <param name="allowscriptaccess" value="always"></param> <embed allowscriptaccess="always" height="81" src="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fsoundcloud.com%2Ftheshiverman%2Fsummer-beats-july-2010&secret_url=false" type="application/x-shockwave-flash" width="100%"></embed> </object>';
if (preg_match('/<object height=\"[0-9]*\" width=\"[0-9]*\"><param name=\"movie\" value=\"(.*)\"><\/param><param name=\"allowscriptaccess\" value=\"always\"><\/param><embed allowscriptaccess=\"always\" height=\"[0-9]*\" src=\".*\" type=\"application\/x-shockwave-flash\" width=\"100%\"><\/embed><\/object>/', $test)) {
$embed = $test;
} else {
$embed = 'FALSE';
}
我似乎在验证中做错了,因为它总是返回false。
答案 0 :(得分:1)
我看到的第一件事就是失败:
width="100%" will not match /width=\"[0-9]*\"/
我不知道正则表达式的确切PHP定义;但我不确定这是否匹配(reg-expression中的空格可能匹配目标文本中的零个或多个空格,但反过来不起作用):
> <param will not match (probably) /><param/
正如您所看到的,使用正则表达式解析XML很难并且容易出错 您真正想要做的是使用XML SAX解析器。
试试这个:PS我的PHP不是很好,所以它可能包含错误。
PS。长URL未针对XML正确编码。我在这里使用urlencode()来阻止错误消息。我没有检查是否有意义。
<?php
$test = '<object height="81" width="100%">'
.'<param name="movie" value="'
.urlencode('http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fsoundcloud.com%2Ftheshiverman%2Fsummer-beats-july-2010&secret_url=false')
.'">'
.'</param>'
.'<param name="allowscriptaccess" value="always">'
.'</param>'
.'<embed allowscriptaccess="always" height="81" src="'
.urlencode('http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fsoundcloud.com%2Ftheshiverman%2Fsummer-beats-july-2010&secret_url=false')
.'" type="application/x-shockwave-flash" width="100%">'
.'</embed>'
.'</object>';
function JustPrint($parser,$data)
{
print $data;
}
function OpenTag($parser,$name ,$attribs)
{
// For special tags add a new attribute.
if (strcasecmp($name, "object") == 0)
{
$attribs['Martin'] = 'York';
}
// Print the tag.
print "<$name ";
foreach ($attribs as $loop => $value)
{
print "$loop=\"$value\" ";
}
print ">\n";
}
function CloseTag($parser,$name)
{
print "<$name/>\n";
}
$xmlParser = xml_parser_create();
xml_set_default_handler($xmlParser ,'JustPrint' );
xml_set_element_handler($xmlParser, 'OpenTag' , 'CloseTag' );
xml_parse($xmlParser, $test);
?>
答案 1 :(得分:1)
这是我使用的,用你使用的var替换$url
:
if ( strtolower(str_ireplace('www.', '', parse_url($url, PHP_URL_HOST))) == 'soundcloud.com' ) { ?>
<embed id="swf_u621112_1" width="890" height="84" flashvars="width=398&height=84" wmode="opaque" salign="tl" allowscriptaccess="never " allowfullscreen="true" scale="scale" quality="high" bgcolor="#FFFFFF" name="swf_u621112_1" style="" src="http://player.soundcloud.com/p layer.swf?url=<?php echo htmlspecialchars(urlencode($url)) ?>" type="application/x-shockwave-flash">
<?php
}
答案 2 :(得分:0)
我不想在可能的情况下操纵它(只需替换高度值。我希望它保持原样,我使用正则表达式来模仿sql注入并确保它是嵌入代码。< / p>
它不仅可以被视为一个字符串并保持原样,而是检查某些东西吗?
例如,这适用于youtube嵌入链接:
/preg_match(<object width=\"([0-9]*)\" height=\"([0-9]*)\"><param name=\"movie\" value=\"(.*)\"><\/param><param name=\"allowFullScreen\" value=\".*\"><\/param><param name=\"allowscriptaccess\" value=\".*\"><\/param><embed src=\".*\" type=\".*\" allowscriptaccess=\".*\" allowfullscreen=\".*\" width=\"[0-9]*\" height=\"[0-9]*\"><\/embed><\/object>/',$test,$preg_out)
的preg_match [0] 的preg_match [1] 的preg_match [3]
返回对象的宽度高度和网址。
答案 3 :(得分:0)
如果您想要做的是允许用户在保留播放器样式的权限的同时为您提供SoundCloud嵌入,您可能需要查看受SoundCloud(see here)和其他人支持的oEmbed。派对。这样,用户只需输入正常的跟踪网址即可,您可以根据需要在后端解析这些网址。
另外,请记住,具有不同<param>
次序的嵌入代码仍然是有效的嵌入代码,但很难与正则表达式匹配