从字符串中获取字符串?爆炸?

时间:2012-04-15 16:44:46

标签: php

我有以下字符串

<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"脚本将不再起作用),有什么其他的方法对我需要的字符串的语法更改有点防范吗?

3 个答案:

答案 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的查询字符串。当然,首先你要删除所有额外的内容。只需使用正则表达式提取查询字符串