我将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);
}
检查开始,通过将起始长度添加到其位置来获取标记位置,然后在标记开始时搜索原始字符串中的标记结束(“),然后从开始到结束搜索子标记。
构建从tokenstart
到tokenend
的字符串会比substr
更快吗?
答案 0 :(得分:1)
有更好的更有效的方法吗?
是的,您可以使用strpos
的偏移参数来搜索第一个双引号后面的$after
位置。此时你知道变量的长度并且可以像你已经那样提取值(即,你只需要一个substr()
)。
但是,我认为在这一点上任何进一步的优化都可能只是一个很小的变化。
实际上,我不太确定您是否需要担心preg_match
的速度 - 而且 使用preg_match
只是为了检查“,你”还要提取价值。