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 ответа
Есть несколько способов получить последнюю часть $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]);
}