PHP Regexp标头(会话ID)

时间:2015-08-16 20:40:57

标签: php regex preg-match

我有以下代码:

$html = get_data($url);

我想从此代码中提取会话ID,其代码如下:

  

PHPSESSID = aaabbb123456789;

我想将会话ID(仅ID)存储在var中。我用这个正则表达式:

preg_match('#PHPSESSID=(.+?);#is', $html, $result);

我几乎得到了我想要的东西,但$ result选项卡包含两个字符串。这是var_dump()

array(2) { [0]=> string(37) "PHPSESSID=aaabbb123456789;" [1]=> string(26) "aaabbb123456789" } 

我希望preg_match()仅返回ID,如$result[1]中所示。我应该在正则表达式中改变什么?

由于

3 个答案:

答案 0 :(得分:2)

正则表达式匹配的结果列表通常具有第一个结果是整个字符串。 PHP的preg_match()也保证了这一点:

  

如果提供匹配,则会填充搜索结果。 $matches[0]将包含与完整模式匹配的文本,$matches[1]将具有与第一个捕获的带括号的子模式匹配的文本,依此类推。

因此,您可以安全地将值提取为$result[1],而不必担心它可能会发生变化并引发警告。

答案 1 :(得分:1)

你不能改变它,这就是命令的工作方式。

$ result [0]将始终是整个匹配的正则表达式,而之后的每个索引都将对应一个组。

您可以通过不使用组来消除后续索引,如下所示:

CREATE FUNCTION findAge (@dateOfBirth DATE)
RETURNS INT
AS
BEGIN
  DECLARE @Age INT;

  SET @Age = FLOOR(DATEDIFF(YEAR,@dateOfBirth, GETDATE()));
  RETURN @Age;
END

现在,会话ID将始终位于$ result [0]

preg_match('#(?<=PHPSESSID=)[^;]+#i', $html, $result);

答案 2 :(得分:0)

这并不能完全回答你的问题,但是当涉及字符串处理和解析时,我通常不喜欢在没有必要时使用正则表达式

str_replace("PHPSESSID=", "", str_replace(";", "", $yourString));

除非你的字符串包含超过&#34; PHPSESSID = aaabbb123456789;&#34;