[英]I have a problem with the strpos & substr function on PHP
我對 strpos 和 substr function 有問題,謝謝您的幫助:
$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/>");
/************************************/
為什么output是這樣的??
hhp+123@gmail.com,P:h123 +h123
但我想要這個:
hhp+123@gmail.com,h123
問題是$find_and
是 , 的索引,
但是substr()
的第三個參數需要是 substring 的長度,而不是結束索引。 所以
$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;
}
如果您可以控制輸入,我會建議
$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/
與 Barmar 剛剛在評論中所說的相呼應,正則表達式絕對是“分解字符串”的最佳方式。 (從字面上看,它們的用途很大。)這是 PHP 函數的preg_系列。 (例如preg_match
、 preg_match_all
、 preg_replace
。)
“正則表達式”背后的價值百萬美元的想法是它是一種字符串匹配模式。 如果字符串“匹配”該模式,您可以輕松提取與其部分匹配的確切子字符串。
簡而言之,您現在正在努力解決的所有strpos/substr
邏輯...... “消失了!” 噗。
例如,這個模式: ^(.*)|(.*),(.*)$
...
它說:“錨定在字符串^
的開頭,捕獲()
一個由“零次或多次出現的任何字符(.*)
組成的模式,直到遇到文字|
. 現在,對於第二組,繼續直到找到,
。 然后,對於第三組,繼續使用任何字符,直到字符串$
結束。”
您可以“匹配”該正則表達式,並且只需將所有這三個組都交給您。 (以及“匹配的總字符串”。)而且您不必“編寫”任何東西!
到目前為止,有成千上萬的 web 頁面討論了這種“在一個單一的神秘字符串中的非凡‘編程語言’”。 但它可能是任何從業者都知道的最實用的技術,並且每種編程語言都以某種方式實現它,或多或少遵循(仍然活躍的)編程語言Perl
首次設置的先例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.