substr дает пустые результаты в php

Я хочу получить последние 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 ответа

Измените разрешение папки на 777 и снова протестируйте код.

Есть несколько способов получить последнюю часть $result строка указана в вопросе.

а) substr()

Функция substr() это самый простой способ сделать это (как вы уже сделали).

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

б) регулярные выражения: preg_replace()

Ты можешь использовать preg_replace() чтобы сопоставить последние 41 символ строки в группу и заменить всю строку группой:

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

Регулярное выражение, используемое для поиска:

  • ^ начало строки;
  • .* любой персонаж (.), ноль или более раз (*);
  • (.{41}) любой персонаж (.) 41 раз ({41}); круглые скобки вокруг выражения составляют подшаблон, который можно использовать позже в regex или в строке замены (как $1);
  • $ это конец строки.

Соответствует любой строке длиной не менее 41 символа; последние 41 символ сгруппированы в первом подшаблоне.

Строка замены ($1) относится к 1-му regex, Это делает preg_replace() замените совпавшую строку (всю строку) ее первым подшаблоном (его последние 41 символ). Узнайте больше о синтаксисе шаблонов PCRE.

в) преобразовать строку в массив символов

Преобразовать строку в массив символов (str_split()), извлечь правильный фрагмент массива (array_slice()), присоедините символы назад (implode()).

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

Это решение работает так же, как substr(),

г) разбить строку на части, используя разделитель

Если вы уверены, что часть строки, которую вам нужно извлечь, не содержит тире (-) и он начинается сразу после последней черты, тогда нам даже не нужно знать его длину. использование 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];

е)...

С небольшим воображением, более сложные способы извлечения части строки могут быть созданы в несколько строк кода.

Заключение

Дано $result является непустой строкой длиной не менее 41, все вышеперечисленное должно работать и давать одинаковый результат. preg_replace() решение не будет работать для более коротких строк (может быть легко изменено на работу), explode() решение не волнует 41 но использует - отделить кусочки.

Если ни один из них не работает, то ваша проблема в другом месте. Проверьте права на файл, проверьте, входит ли код в if филиал и т. д.

На самом деле

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

делает это, то есть он вернет последние 41 символ. Проблема, скорее всего, заключается в том, что ваша функция декодирования не работает, и вы никогда не вводите, если

$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]);
}
Другие вопросы по тегам