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