substr在PHP中给出空结果

问题描述 投票:-1回答:3

我想得到一个字符串的最后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);
}
php substr
3个回答
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]);
}

0
投票

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


0
投票

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

a) substr()

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

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

b) regular expressions: 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) convert the string to array of characters

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

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

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

d) split the string into pieces using delimiter

如果你确定你需要提取的字符串部分不包含任何破折号(-)并且它在最后一个破折号后面开始,那么我们甚至不需要知道它的长度。使用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分支等。

© www.soinside.com 2019 - 2024. All rights reserved.