PHP 上的 strpos 和 substr 函数有问题

I have a problem with the strpos & substr function on PHP

strpos 和 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

如果您可以控制输入,我建议

$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/ is a great site for testing php code ... here is an example of this working https://3v4l.org/upEGG

与 Barmar 刚才在评论中所说的相呼应,正则表达式 绝对是“分解字符串”的最佳方式。 (这实际上是它们 的大部分功能。) 这是 preg_ 家族的 PHP 函数。 (例如 preg_matchpreg_match_allpreg_replace。)

“正则表达式”背后的百万美元想法是它是一个字符串匹配 模式。 如果字符串“匹配”该模式,您可以轻松提取匹配其中 部分 的确切子串。

简而言之,所有 您现在正纠结的 strpos/substr 逻辑……“消失了!” 噗。

例如,这个模式:^(.*)|(.*),(.*)$ ...

它说:“锚定在字符串 ^ 的开头,捕获 () 由“零次或多次出现的任何字符 (.*) 组成的模式,直到遇到文字 |。现在,对于第二组,继续直到找到 ,。然后,对于第三组,继续取任何字符,直到字符串结尾 $."

您可以“匹配”该正则表达式并简单地交给所有这三个组! (以及“匹配的总字符串。”)而且您不必“写”东西!

现在有 数千 个网页讨论这个“在一个神秘字符串中的非凡 'programming language'”。但它可能是任何从业者都知道的最实用的技术,而且每种编程语言或多或少都以某种方式实现了它遵循(仍然有效的)编程语言首先设定的先例,Perl.

问题是$find_and,的索引,但是substr()的第三个参数需要是子串的长度,而不是结束索引。所以

$find_email = substr($temp,$find_or+3,$find_and);

应该是

$find_email = substr($temp,$find_or+3,$find_and-$find_or-3);

对于 $find_passeord 你可以省略第三个参数,因为默认是字符串的结尾。

但是,使用正则表达式会更简单:

if (preg_match('/^U:(.*?)\|E:(.*?),P:(.*)/', $temp, $match)) {
    list($whole, $user, $email, $password) = $match;
}