2012-04-15 135 views
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出來。

我想通過=爆炸,然後抓住倒數第二個價值,但(如果他們的Flash變數變量的腳本將不再工作之後再添herp="blah"例子),這可能是容易出錯,有沒有任何其他辦法對我需要的字符串進行語法修改要稍微強一點?

回答

1

此處適當的方法是使用正確的HTML解析庫解析HTML,並從<embed>標記中提取flashvars屬性。如果你只有其中一個,你可以使用正則表達式。

該表達式將檢索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]中。

0

有一種更好的方式來做到這一點,看看:

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

它解析URL的查詢字符串。當然,你必須首先刪除所有額外的內容。只需使用正則表達式提取查詢字符串

+1

強烈建議您使用它的陣列PARAM雖然 - 保存 – ChrisK 2012-04-15 16:54:13

+0

事實上,這將很好地工作潛在的安全問題......我甚至都不需要刪除多餘的垃圾。 – Steven 2012-04-15 16:54:26

+0

你是什麼意思的數組參數? – Steven 2012-04-15 16:54:59

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);