#php #substr #strpos
Вопрос:
У меня проблема с функцией strpos amp; substr, спасибо за вашу помощь:
$temp = "U:hhp|E:123@gmail.com,P:h123";
$find_or = strpos($temp,"|");
$find_and = strpos($temp,",");
$find_user = substr($temp,2,$find_or-2);
$find_email = substr($temp,$find_or 3,$find_and);
$find_passeord = substr($temp,$find_and 3,strlen($temp));
echo("$find_user $find_email $find_passeord<br/>");
/************************************/
Почему результат такой ??
hhp 123@gmail.com,P:h123 h123
но я хочу этого:
hhp 123@gmail.com,h123
Комментарии:
1. Проблема в том, что
substr()
третьим параметром является длина, а не конечная позиция.2. Какой результат, который вы ищете, мог бы помочь? Это похоже на это, потому что именно это делает ваш код
3. Регулярное выражение было бы лучшим способом сделать это.
4. @Barmar спасибо, этого не было, когда я добавлял свой комментарий
Ответ №1:
Проблема в том , что $find_and
это индекс ,
, но третьим аргументом to substr()
должна быть длина подстроки, а не конечный индекс. Так что
$find_email = substr($temp,$find_or 3,$find_and);
должно быть
$find_email = substr($temp,$find_or 3,$find_and-$find_or-3);
Ибо $find_passeord
вы можете опустить 3-й аргумент, так как по умолчанию используется конец строки.
Однако с регулярным выражением это было бы проще:
if (preg_match('/^U:(.*?)|E:(.*?),P:(.*)/', $temp, $match)) {
list($whole, $user, $email, $password) = $match;
}
Ответ №2:
если у вас есть контроль над вводом, я бы предложил
$temp = "U:hhp|E:123@gmail.com|P:h123";
list($user, $email, $password) = explode("|",$temp);
$user = explode(":",$user)[1];
$email = explode(":",$email)[1];
$password = explode(":",$password)[1];
если нет, то я все равно рекомендую разбить строку на части и работать над тем, что вам нужно . https://3v4l.org/ — отличный сайт для тестирования php-кода … вот пример такой работы https://3v4l.org/upEGG
Ответ №3:
Повторяя то, что только что сказал Бармар в комментарии, регулярные выражения, безусловно, являются лучшим способом «разбить строку». (Это в буквальном смысле большая часть того, для чего они предназначены.) Это семейство функций PHP preg_. (например preg_match
, preg_match_all
, preg_replace
.)
Идея «регулярного выражения» стоимостью в миллион долларов заключается в том, что оно представляет собой шаблон, соответствующий строке. если строка «соответствует» этому шаблону, вы можете легко извлечь точные подстроки, которые соответствовали его частям.
Короче говоря, вся strpos/substr
логика, с которой вы сейчас боретесь … «уходит!» — Пуф.
Например, этот шаблон: ^(.*)|(.*),(.*)$
…
В нем говорится: «Закрепленный в начале строки ^
, захватите ()
шаблон , состоящий из «нуля или более вхождений любого символа (.*)
, пока вы не столкнетесь с литералом |
. Теперь, для второй группы, продолжайте, пока не найдете а ,
. Затем, для третьей группы, продолжайте брать любой символ до конца строки $
«.
Вы можете «сопоставить» это регулярное выражение и просто получить все три из этих групп! (А также «общая строка, которая совпала».) И вам не нужно было ничего «писать»!
К настоящему времени существуют тысячи веб-страниц, на которых обсуждается этот «замечательный»язык программирования» в рамках одной загадочной строки». Но это может быть самая прагматически полезная технология, которую должен знать любой практик, и каждый язык программирования так или иначе реализует ее, более или менее следуя прецеденту, впервые созданному (все еще активным) языком программирования Perl
.
Комментарии:
1. Отличная рекламная подача для регулярных выражений, но на самом деле она не решает проблему операции. Задумывались ли вы о карьере в сфере продаж подержанных автомобилей?