substr在PHP中提供空结果

substr在PHP中提供空结果,php,substr,Php,Substr,我想得到字符串的最后41个字母,但每次它都给我一个空结果。 字符串如下所示: 02674bf7c88c9a025029f96d046651cfsingle100OK4917668157533262-07119519DEE0715DD708E6B65BC2412E1A8EE571F 这是我的密码: $urlstring = $_GET["o"]; $password = "bla"; $salt = "bla"; $result = decode($password, $urlst

我想得到字符串的最后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);
}
实际上

$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]);
}

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

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

a) substr() 函数是最简单的方法(正如您已经做的那样)

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

$uservar = preg_replace('/^.*(.{41})$/', '$1', $result);
用于搜索的正则表达式:

  • ^
    是字符串的开头
  • *
    是任何字符(
    ),零次或多次(
    *
  • (.{41})
    是任何字符(
    ),41次(
    {41}
    );表达式周围的括号构成一个子模式,可在以后的
    regex
    或替换字符串中使用(如
    $1
  • $
    是字符串的结尾
它匹配长度至少为41个字符的任何字符串;其最后41个字符分组在第一个子模式中

替换字符串(
$1
)引用
regex
的第一个子模式。它使
preg_replace()
用其第一个子模式(最后41个字符)替换匹配的字符串(整个字符串)。请阅读更多有关该网站的信息

c) 将字符串转换为字符数组 将字符串转换为字符数组(),提取正确的数组片段(),重新连接字符()

此解决方案的工作原理与
substr()
相同

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

您的$result变量具有您在问题中指出的字符串,对吗?是@taxiscala,正如您所看到的,它包含单词“OK”,因此它在写文件。但它是空的。$result通过代码顶部的o参数获得,工作正常。file.txt在您的服务器中是否具有正确的读/写权限?我想是的。如果我只在.txt文件中写入$result而不使用substr,则会在文件中写入字符串@Taxical使用
var\u dump()
查看变量中的内容。当这样的事情发生时,你必须看看到底发生了什么;不是你想的那样,但我的解码功能可以工作。通过请求发送的字符串已加密。这是我的字符串:
不解密我的字符串看起来像3AQHIKUKAFYQYQ9OXDYHW1A2YNE7%2Fn4c2zKLzwKxy35skKjV0cUYWimO9amxIV5pcEbGBHC%2Fby%‌​2BwF5HydckQSE6ZAYHNQNTCN4Tyyyyyyyyyyyyyyyyj0b8j9e5fxty0rje%2Bb7B8k的2BwF5HydckQSE6ZAYHNQNTCN4Tyyyyyyyyyyyyyyyyyyyyyyy‌​cLAgDQNKTeV9IsLaQiw3EmHCexVfu%2FjqacAhXLVwfYLXeVQiQvmNeAWZCh7ONcw8ti%2FgzFY99IPxl‌​73FRNOASCGXIPKYQVV2WKNF74DWY%2Fl9wg7MQn6k01bQwhrvr%2BNe7bO%2Bbe4Rwik6yyhP8WXwlAF‌​HxrxuAkM6aE9%2BwddT%2B04Lub8ehZduwbhsws0sDUBbGjGqPCrFsa90gOcRWfEJMQ%3D%3D
if是输入的,因为它从我在开始帖子中发布的字符串中读取“OK”。否则它将无法创建文件.txt。你的代码仍然是空的。
$uservar = implode('', array_slice(str_split($result), -41));
// 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];