簡體   English   中英

我在 PHP 上的 strpos 和 substr function 有問題

[英]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_matchpreg_match_allpreg_replace 。)

“正則表達式”背后的價值百萬美元的想法是它是一種字符串匹配模式。 如果字符串“匹配”該模式,您可以輕松提取與其部分匹配的確切子字符串。

簡而言之,您現在正在努力解決的所有strpos/substr邏輯...... “消失了!” 噗。

例如,這個模式: ^(.*)|(.*),(.*)$ ...

它說:“錨定在字符串^的開頭,捕獲()一個由“零次或多次出現的任何字符(.*)組成的模式,直到遇到文字| . 現在,對於第二組,繼續直到找到, 然后,對於第三組,繼續使用任何字符,直到字符串$結束。”

您可以“匹配”該正則表達式,並且只需將所有這三個組都交給您。 (以及“匹配的總字符串”。)而且您不必“編寫”任何東西!

到目前為止,有成千上萬的 web 頁面討論了這種“在一個單一的神秘字符串中的非凡‘編程語言’”。 但它可能是任何從業者都知道最實用的技術,並且每種編程語言都以某種方式實現它,或多或少遵循(仍然活躍的)編程語言Perl首次設置的先例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM