substr在PHP中给出空结果

时间:2015-07-06 22:00:31

标签: php substr

我想得到一个字符串的最后41个字母,但每次它给我一个空的结果。 字符串如下:

02674bf7c88c9a025029f96d046651cfsingle100OK4917668157533262-07119519DEE0715DD708E6B65BC2412E1A8EE571F

这是我的代码:

$urlstring = $_GET["o"];  
$password = "bla"; 
$salt = "bla";    
$result = decode($password, $urlstring, $salt); 
if (strpos($result,'OK') !== false) {
    $uservar = substr($result, -41); 
    $file = 'file.txt';
    file_put_contents($file,$uservar);
}

3 个答案:

答案 0 :(得分:0)

实际上

$uservar = substr($result, -41); 

这样做,即它将返回最后41个字符。最有可能的问题是您的解码功能无法正常工作,您永远不会输入if

$result = decode($password, $urlstring, $salt); 
if (strpos($result,'OK') !== false) {   // check if $result contains OK
    $uservar = explode('-', $result); 
    $file = 'file.txt';
    file_put_contents($file, $uservar[1]);
}

答案 1 :(得分:0)

将文件夹权限更改为777,然后再次测试代码。

答案 2 :(得分:0)

有几种方法可以获得问题中提供的$result字符串的最后一部分。

a)substr()

函数substr()是最简单的方法(就像你已经做过的那样)。

$uservar = substr($result, -41);

b)正则表达式:preg_replace()

您可以使用preg_replace()将字符串的最后41个字符匹配到一个组中,并将整个字符串替换为该组:

$uservar = preg_replace('/^.*(.{41})$/', '$1', $result);

用于搜索的正则表达式:

  • ^是字符串的开头;
  • .*是任何字符(.),零次或多次(*);
  • (.{41})是任何字符(.),41次({41});表达式周围的括号构成一个子模式,可以在regex或替换字符串中使用(如$1);
  • $是字符串的结尾。

匹配任何长度至少为41个字符的字符串;它的最后41个字符分组在第一个子模式中。

替换字符串($1)指的是regex的第一个子模式。它使preg_replace()用其第一个子模式(最后41个字符)替换匹配的字符串(整个字符串)。详细了解PCRE patterns syntax

c)将字符串转换为字符数组

将字符串转换为字符数组(str_split()),提取正确的数组切片(array_slice()),然后将字符连接起来(implode())。

$uservar = implode('', array_slice(str_split($result), -41));

此解决方案与substr()的工作方式相同。

d)使用分隔符

将字符串拆分为多个部分

如果你确定你需要提取的字符串部分不包含任何破折号(-)并且它在最后一个破折号后面开始,那么我们甚至不需要知道它的长度。使用explode()$result拆分为由短划线(-)分隔的部分,最后一部分是您需要的部分:

// Split the string into pieces
$pieces = explode('-', $result);
// Remove the last item from $pieces and return it
$uservar = array_pop($pieces);
// Alternatively, without modifying $pieces:
$uservar = end($pieces);
// Or
$uservar = $pieces[count($piece)-1];

e)......

只需很少的想象力,就可以通过几行代码生成更复杂的提取字符串部分的方法。

结论

鉴于$result是一个非空字符串,其长度至少为41,所有上述内容都应该起作用并产生相同的结果。 preg_replace()解决方案不适用于较短的字符串(可以轻松更改为工作),explode()解决方案不关心41,但使用-分隔件。

如果它们都不起作用那么你的问题就在别的地方。检查文件权限,检查代码是否进入if分支等。