我有以下字符串
<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
。
我正在考虑通过=
进行爆炸然后获取倒数第二个值,但这可能容易出错(例如,如果他们在flashvars变量之后添加另一个herp="blah"
脚本将不再起作用),有什么其他的方法对我需要的字符串的语法更改有点防范吗?
答案 0 :(得分: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);
答案 1 :(得分: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]
属性的结束引号,并将其存储在第一个捕获组{{1}}中。
答案 2 :(得分:0)
有一种更好的方法,请看一下:
http://php.net/manual/en/function.parse-str.php
它解析URL的查询字符串。当然,首先你要删除所有额外的内容。只需使用正则表达式提取查询字符串