在PHP

时间:2015-10-03 15:27:15

标签: php regex string

我将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);
}

检查开始,通过将起始长度添加到其位置来获取标记位置,然后在标记开始时搜索原始字符串中的标记结束(“),然后从开始到结束搜索子标记。

构建从tokenstarttokenend的字符串会比substr更快吗?

1 个答案:

答案 0 :(得分:1)

  

有更好的更有效的方法吗?

是的,您可以使用strpos偏移参数来搜索第一个双引号后面的$after位置。此时你知道变量的长度并且可以像你已经那样提取值(即,你只需要一个substr())。

但是,我认为在这一点上任何进一步的优化都可能只是一个很小的变化。

实际上,我不太确定您是否需要担心preg_match的速度 - 而且 使用preg_match只是为了检查“,你”还要提取价值。