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_match
、preg_match_all
、preg_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;
}
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_match
、preg_match_all
、preg_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;
}