【问题标题】:Embed code regular expression won't work嵌入代码正则表达式不起作用
【发布时间】:2010-08-17 05:54:50
【问题描述】:

我编写了一个正则表达式,用于提取用户输入的值并替换一些高度和宽度值并保留 URL。这样可以安全地将其添加到数据库中。

这是我目前所拥有的(只是试图让 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。

【问题讨论】:

标签: php regex preg-match embedded-video


【解决方案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);

?>

【讨论】:

  • 啊,我想它可能是。我在找出要匹配的字符时遇到了很多麻烦。将 \"(.*)\" 匹配 "player.soundcloud.com/…" 吗?我有点认为这两者都是,但我的正则表达式真的让我感到困惑。
  • 我不知道我在该链接中寻找什么。
  • 它是一个 XML 解析器。您要做的是将 XML 读入数据结构。修改并写回。使用正则表达式来尝试和操作 XML 是一场失败的游戏。
  • 对不起,我不知道从哪里开始。我真的不知道您要做什么,也不知道我会用该代码做什么。无论如何我都不想改变它,否则当它从那个数据库中吐出来时,它就没有任何意义了。我只是想确保它具有正确的格式并且可以安全地放入 sql 查询中。你是在告诉我没有一个正则表达式允许一个带有百分比符号的网址吗?我只是想这样做并在它周围加上一些括号,以便我可以将它放入一个数组中。
  • @Michael Mallet:我的意思是,使用 reg 表达式解析 XML 是个坏主意。您确实需要学习如何使用 XML 解析器。
【解决方案2】:

这是我使用的,用你使用的任何 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
}

【讨论】:

    【解决方案3】:

    如果您想要做的是允许用户为您提供 SoundCloud 嵌入,同时您保留设置播放器样式的权利,您可能需要查看 SoundCloud (see here) 和其他各方支持的 oEmbed。这样,用户只需输入他们正常的跟踪 URL,您就可以在后端根据需要解析这些 URL。

    另外,请记住,具有不同 &lt;param&gt; 顺序的嵌入代码仍然是有效的嵌入代码,但很难与正则表达式匹配

    【讨论】:

      【解决方案4】:

      如果可能的话,我不想操纵它(只需替换高度值。我希望它保持原样,我正在使用正则表达式来模拟 sql 注入并确保它是一个嵌入代码。

      它不仅可以被视为一个字符串并保持原样,而且可以检查一些东西吗?

      例如,这适用于 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] 预匹配[1] preg_match[3]

      返回对象的宽高和url。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-01
        • 1970-01-01
        • 2011-03-01
        相关资源
        最近更新 更多