2014-09-26 37 views
0

我正在尝试从该字符串中提取令牌3BF50B3A9BCB2BC8E40256F30B7F2C22preg替换正则表达式提取字符串

$longtext="rt%3D280'; HdfJson['postToken'] = '3BF50B3A9BCB2BC8E40256F30B7F2C22';HdfJson['googleUrlHl'] ="; 

$token=preg_replace("/(\[\'postToken']\s\=\s)(\'[a-zA-Z0-9]+\')(\;)/u","$2",$longtext); 
echo $token; 


的resultat是这样的:

rt%3D280'; HdfJson['postToken'] = HdfJson['googleUrlHl'] = 

如何只提取令牌

+0

因为你只是想提取一些东西,'preg_match'比'preg_replace' *更适合(用于替换)* – 2014-09-26 14:40:48

回答

0

您还需要按照.*匹配上一个和下一个字符,以便只有整行将由您指定的组代替。

.*(?:\[\'postToken']\s\=\s)\'([a-zA-Z0-9]+)\';.* 
|            | 
Here          Here 

DEMO

代码:

<?php 
$longtext="rt%3D280'; HdfJson['postToken'] = '3BF50B3A9BCB2BC8E40256F30B7F2C22';HdfJson['googleUrlHl'] ="; 
$token=preg_replace("~.*(?:\[\'postToken']\s\=\s)\'([a-zA-Z0-9]+)\';.*~u","$1",$longtext); 
echo $token; 
?> 

输出:

3BF50B3A9BCB2BC8E40256F30B7F2C22 
+0

是的,谢谢,还有“/.*(([A-F0-9]){ 32})。*/u“正在工作 – ro0xandr 2014-09-26 14:29:50

+0

是的。主要的是你需要在前后添加'。*'。我只是修改了你的正则表达式并将其作为解决方案发布。你可以根据你的需要修改我的。我已经发现了这个问题。 – 2014-09-26 14:30:47

0

你并不需要使用的preg_replace要做到这一点,如果你想提取从东西字符串而不修改它,使用的函数是preg_match。例如:

$str = "rt%3D280'; HdfJson['postToken'] = '3BF50B3A9BCB2BC8E40256F30B7F2C22';HdfJson['googleUrlHl'] ="; 

$re = '/\QHdfJson['postToken'] = '\E([[:xdigit:]]+)';/'; 
           // ↑_____________↑    
if (preg_match($re, $str, $m)) //   | 
    $token = $m[1]; // first capturing group 

之间\Q\E所有的特殊字符都被忽略(除了图案分隔符)。将文字字符串复制/粘贴到一个模式中是很有用的,而不必询问有关必须转义或不转的问题。 (有关信息,只需要[需要转义)

[:xdigit:]字符类只包含十六进制字符。但是如果你想要更严格的话,你可以把它改成[A-F0-9],它不包含[a-f]