[英]Most efficient way to extract a substring of a string in PHP
我將HTML頁面的內容作為PHP字符串。 我想從該字符串中提取一個javascript變量值。 我知道在字符串中聲明變量的格式將始終是:
var token = "var_value"; //var_value is alphanumeric
因此,我試圖在var token = "
和";
之間找到一個值";
通過使用正則表達式來做到這一點:
preg_match("/var token = \"(.*?)\"/", $haystack, $result)
問題在於字符串是HTML / JS代碼,要解析的很大(字符長度超過8k),並且從preg_match()的文檔中得知
小費
如果只想檢查一個字符串是否包含在另一個字符串中,請不要使用preg_match()。 請改用strpos(),因為它將更快。
所以我去做了,但是我仍然擔心它是否更有效。
$before = 'var token = "';
$after = '"';
if ($t = strpos($haystack, $before)) {
$tokenstart = substr($haystack, $t + strlen($before));
$g = strpos($tokenstart, $after);
$token = substr($tokenstart, 0, $g);
}
首先,定義所需值之前和之后的字符串,然后在字符串中找到起始位置。 然后,使用substr() ,返回不包含值之前所有內容的字符串。 做什么是價值后是相同的:獲得的起始位置"
之后(有沒有它在我的變量,因為它的字母),並刪除一切。
我認為strpos
比strstr
更有效,這使它成為更好的方法,因為我知道我需要的確切格式。 它還在字符串的第一次出現時停止,而不是查找所有字符串。
有沒有更好,更有效的方法來做到這一點?
編輯
從答案來看,我做到了如下。 減少一個substr很有道理。 還添加了false
檢查,以確保。
if (false !== $ts = strpos($scripttext, $before)) {
$tokenstart=$ts+strlen($before);
$tokenend= strpos($scripttext, $after,$tokenstart);
$token = substr($scripttext, $tokenstart,$tokenend-$tokenstart);
}
檢查起始位置,方法是將起始長度添加到起始位置,以獲取令牌位置,然后在原始字符串中搜索令牌結尾(“),從令牌起始位置開始,然后從起始位置到結尾處使用substr。
從tokenstart
到tokenend
構造一個字符串會比substr
快嗎?
有沒有更好,更有效的方法來做到這一點?
是的,您可以使用strpos
的offset參數從第一個雙引號$after
開始搜索$after
位置。 在這一點上,您知道變量的長度,並且可以像已經那樣提取值(即,只需要一個substr()
)。
但是,我認為目前任何進一步的優化都可能只是很小的變化。
實際上,我不太確定您是否需要擔心preg_match
的速度-您不是在使用preg_match
“只是檢查”,而是在提取值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.