我正在尝试从 URL 查询中提取值。 这是输入文本的一部分:
u0026amp;sw=0.1\u0026amp;t=vjVQa1PpcFMYuRsz10_H-1z41mWWe8d6ENEnBLE7gug%3D
我需要隔离
t=
和 %3D
之间的子字符串以获得:
vjVQa1PpcFMYuRsz10_H-1z41mWWe8d6ENEnBLE7gug
到目前为止,我正在使用这个
[^(t=)]\S{42}
,但它匹配所有字符串,我如何让它只匹配该t
值?
您链接到的页面似乎不包含您正在搜索的字符串?但要匹配页面中任何位置的该字符串,您需要...
/t=\S{42}/
我认为不需要字符类
[...]
或带括号的子模式...?
编辑#1
但是,如果您尝试提取 42 个字符的标记,那么您将需要一个带括号的子模式...
/t=(\S{42})/
编辑#2
提取token的示例。我已将其从 42 个字符更改为 43 个字符,因为您的所有示例似乎都包含 43 个字符的标记。
// This is just some example text from which we want to extract the token...
$text = <<<EOD
SomeText=jkasdhHASGjajAHSKAK?asdjladljasdllkasdjllasdasdl
asdjasiSTARTHERE;t=vjVQa1PpcFMYuRsz10_H-1z41mWWe8d6ENEnBLE7gug%3DENDHEREasdasd
SomeMoreText;t=ThisIsTooShort%3Dklaksj
EOD;
if (preg_match('/;t=([a-zA-Z0-9_-]{43})%3D/',$text,$matches)) {
// Match... vjVQa1PpcFMYuRsz10_H-1z41mWWe8d6ENEnBLE7gug
echo 'TOKEN: '.$matches[1];
} else {
// No match
}
我已将模式更改为更具限制性,而不是任何非空格字符。现在它可以是任何字母、数字、下划线或连字符。现在必须以
%3D
结尾,并且“t=”之前有一个分号(“;”)。
我没有使用过 php 的正则表达式引擎,但除非它违反 posix 标准和地球上所有其他正则表达式引擎,
[^(t=)]
将匹配除 t
、=
、(
或 )
之外的任何字符。因此,您的正则表达式将匹配后跟 42 个非空白字符。它与您的字符串匹配,因为令牌中实际上有 43 个字符。 你的意思可能是^t=\S{43}$
,或者类似的东西,这可能取决于你用它做什么。