ホームページ  >  記事  >  バックエンド開発  >  phpのtrimメソッドの使用によって引き起こされる問題の分析

phpのtrimメソッドの使用によって引き起こされる問題の分析

不言
不言転載
2019-04-13 11:46:152720ブラウズ

この記事は、php のトリム メソッドの使用によって引き起こされる問題の分析を提供します。一定の参考価値があります。必要な友人は参照できます。お役に立てれば幸いです。

シナリオ

phpの文字列をインターセプトする前後の文字には、ltrim、rtrim、trimの3つのメソッドが含まれています。

次の例では、ltrimメソッドのみが含まれています。例として使用
私の以前の理解では(もちろん私は非常に無知であり、このソースコードを見たことはありません)、文字列の左側にある空の文字列、空のタブなどを削除したい場合は、 ($str)

指定した文字を削除したい場合、たとえば、今 helloworld という文字列があり、先頭の h 文字をインターセプトしたい場合は、直接 var_dump(ltrim( "helloworld", " h")); 期待した結果を取得し、elloworld を出力できます
上記はすべて私が考えた範囲内であり、一度印刷する必要があるまでは、常にこの方法で使用してきました。一部の文字列で openssl_encrypt 暗号化を実行します。暗号化後、base64 を作成し、特別な文字列プレフィックス KO: で結合します。各暗号化が完了した後、KO: 文字を結合します。同様に、復号化する前に、最初に KO: を削除し、次に KO: を削除します。結果は、復号結果は「どうやって解いても失敗しました。その後、いくつかのブレークポイントを作成したところ、ltrim を使用したときの結果が期待した結果と異なることがわかりました。

」再発

<?php
// 以下做一个简单的情景复现

$str = "abccabdefg";
$character_mask = “abc”;    

var_dump(ltrim($str,  $character_mask));    // 输出结果为 bdefg,而不是只截取前三位的abc

原因分析

上記の小さなステップのデモを終えると、その理由がわかるはずです。最も簡単で一般的な方法は、前の $str に対して文字ごとに回転トレーニングを実行することです。文字を取得し、後続の $character_mask に含まれているかどうかを確認します。含まれている場合は続行します。インターセプトし、存在しない場合は実行を停止します。
Expression in the form of ltrim code:

<?php 

$str = "abcccabdecbag";

$res = '';
$character_mask = 'abc';

$arrStr = str_split($str);        // 字符串转数组

for ($i=0; $i<=count($arrStr); $i++) {
        if(strpos($character_mask, $arrStr[$i]) !== false) {
                unset($arrStr[$i]);
        } else {
                break;
        }
}

echo ltrim($str, $character_mask);
echo "\r\n";
echo implode($arrStr);
echo "\r\n";

Solution

解決策は、php でいくつかの文字列操作関数を使用し、より基本的な判断を追加することです

  if (substr($str, 0, strlen($character_mask)) == $character_mask) {
            echo substr($str, strlen($character_mask));
  }

以上がphpのtrimメソッドの使用によって引き起こされる問題の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。