1

我有以下字符串

<embed src='herp.com'  width='240' height='180'  allowscriptaccess='always' allowfullscreen='true' flashvars='volume=94&stretching=fill&file=http%3A%2F%2Fmedia.cdn.com%2FTHEMP%2Fflash%2Ffile.mp4&plugins=viral-1d'/>

我想http%3A%2F%2Fmedia.cdn.com%2FTHEMP%2Fflash%2Ffile.mp4&plugins=viral-1d摆脱它。

我在想爆炸=然后抓住倒数第二个值,但这可能容易出错(例如,如果他们herp="blah"在 flashvars 变量之后添加另一个脚本将不再工作),是否有任何其他方式对语法更防弹我需要的字符串周围的变化?

4

3 回答 3

2
$str = "<embed src='herp.com'  width='240' height='180'  allowscriptaccess='always' allowfullscreen='true' flashvars='volume=94&stretching=fill&file=http%3A%2F%2Fmedia.cdn.com%2FTHEMP%2Fflash%2Ffile.mp4&plugins=viral-1d'/>";

// figure out where the params begin (keep the starting quote)
$strpos = strpos($str, "flashvars=") + strlen("flashvars=");
$str = substr($str, $strpos);

// get the quoting char
$delimiter = $str[0];

// first match strtok returns is our param list
$str = strtok($str, $delimiter);

parse_str($str, $params);

var_dump($params);
于 2012-04-15T16:58:04.847 回答
1

此处正确的方法是使用适当的 HTML 解析库解析 HTML,并从标签中提取flashvars属性。<embed>如果你只有其中一个,你真的可以只使用正则表达式。

该表达式将检索flashvars属性,并将该值传递parse_str()给以检索所有查询字符串组件。 parse_str()会打电话urldecode()给他们,所以你不需要。

// Regex gets the entire flahsvars
$pattern = "/<embed[^>]+flashvars='([^']+)'/";
preg_match($pattern, $embed, $matches);

// $matches[1] now holds the full contents of `flashvars`

// Then parse_str() on the result:
$parts = array();
parse_str($matches[1], $parts);
print_r($parts);

// The part you want is in the file key:
echo $parts['file'];


Array
(
    [volume] => 94
    [stretching] => fill
    [file] => http://media.cdn.com/THEMP/flash/file.mp4
    [plugins] => viral-1d
)

使用的正则表达式的解释:

/<embed[^>]+flashvars='([^']+)'/

它首先查找<embed后跟结束符>( [^>]+) 之外的任何字符。后面的捕获组flashvars=将查找属性上直到但不包括结束引号的所有字符,flashvars并将它们存储在第一个捕获组$matches[1]中。

于 2012-04-15T16:56:17.730 回答
0

有一个更好的方法可以做到这一点,看看:

http://php.net/manual/en/function.parse-str.php

它解析 URL 的查询字符串。当然,您必须先删除所有多余的内容。只需使用正则表达式提取查询字符串

于 2012-04-15T16:51:48.983 回答