簡體   English   中英

在PHP中提取字符串的子字符串的最有效方法

[英]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() ,返回不包含值之前所有內容的字符串。 做什么是價值后是相同的:獲得的起始位置"之后(有沒有它在我的變量,因為它的字母),並刪除一切。

我認為strposstrstr更有效,這使它成為更好的方法,因為我知道我需要的確切格式。 它還在字符串的第一次出現時停止,而不是查找所有字符串。

有沒有更好,更有效的方法來做到這一點?

編輯

從答案來看,我做到了如下。 減少一個substr很有道理。 還添加了false檢查,以確保。

if (false !== $ts = strpos($scripttext, $before)) {
    $tokenstart=$ts+strlen($before);
    $tokenend= strpos($scripttext, $after,$tokenstart);
    $token = substr($scripttext, $tokenstart,$tokenend-$tokenstart);
}

檢查起始位置,方法是將起始長度添加到起始位置,以獲取令牌位置,然后在原始字符串中搜索令牌結尾(“),從令牌起始位置開始,然后從起始位置到結尾處使用substr。

tokenstarttokenend構造一個字符串會比substr快嗎?

有沒有更好,更有效的方法來做到這一點?

是的,您可以使用strposoffset參數從第一個雙引號$after開始搜索$after位置。 在這一點上,您知道變量的長度,並且可以像已經那樣提取值(即,只需要一個substr() )。

但是,我認為目前任何進一步的優化都可能只是很小的變化。

實際上,我不太確定您是否需要擔心preg_match的速度-您不是在使用preg_match “只是檢查”,而是在提取值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM