2011-09-17 11 views
0

バグのあるPHPページを "継承"しました。私はこの言語の専門家ではないが、私はバグの起源を見つけたと思う。ループ内で、ページがサーバーにフォーマットされた文字列を送信します。私は、HTMLページ内に見つかった文字列はこの1つのようなものです:PHP:指定された書式設定された文字列の末尾に数値を取得

  • 2011-09-19__full_1 
    
    そう

    、それはそう、私たちは、3つの部分を持っています日付(0,10);

  • 文字列(10,6)。
  • 最終番号(17,1);

    $datagrid[] = array("date"=>substr($post_array_keys[$i], 0, 10),"post_mode"=>substr($post_array_keys[$i], 10, 6),"class_id"=>substr($post_array_keys[$i], 17, 1),"value"=>$_POST[$post_array_keys[$i]]); 
    

    は何が起こる:

    "class_id"=>substr($post_array_keys[$i], 17, 1) 
    

    は次のとおりです。最終的な数は、複数の文字ので、この部分を含めることができます

コードのハンドルこのような状況は以下のとおりです。それは17日から始まる1人のキャラクターだけを取り戻すようだからです(そして、これはウェブサイトに奇妙な振る舞いを引き起こすようです)。

文字列の最後の部分であり、全体の番号を取得するにはこのようにこの行を安全に変更できますか?

"class_id"=>substr($post_array_keys[$i], 17, strlen($post_array_keys[$i])-17); 
+0

あなたが聞きたいものはわかりませんが、著者だけがあなたに明確な答えを与えることができます。コード分​​析に費やされた時間もあります。 @Jon: 'offset = 17'と' length-17'_is_が17から最後までです。しかし、あなたが(@Lotus)3番目のパラメータを省略すると(より最後まで) – KingCrunch

+0

'var_dump(array(" date "=> substr($ post_array_keys [$ i]、 0、10)、 "post_mode" => substr($ post_array_keys [$ i]、10、6)、 "class_id" => substr($ post_array_keys [$ i]、17、1)、 "value" => $ _ POSTあなたの投稿に問題を完全に見てください。 – Timur

+0

@KingCrunchああ、どの機能が混乱しているのだろうか?しかたがない。編集されたta。 あなたはexplode()を使うことができます(二重のアンダースコアは痛みかもしれませんが)。あるいは、正規表現を使うこともできます。言ってるだけ'。 –

答えて

0

コードを変更すると、最後の17桁目から数字が得られます。元のコードは最初の桁のみを取得します。あなたのコードはすべての数字を取得します。

そして、あなたがあなたが変数に期待すべきものの非常に良い手掛かり与えるん宿題ライン

$datagrid[] = array("date"=>substr($post_array_keys[$i], 0, 10),"post_mode"=>substr($post_array_keys[$i], 10, 6),"class_id"=>substr($post_array_keys[$i], 17, 1),"value"=>$_POST[$post_array_keys[$i]]); 

をしたようだ:あなたも確認された場合

first 10 is the date 
then you have 6 chars for post_mode 
then you have 1 char for class_id 

をその時々 class_idは1文字以上にすることができます。提案された変更は最後に完全なclass_idを与えます。

幸運。

0

あなたは

$array = explode("_", $string); 

にこの機能を使用することができ、 "_" で区切られた文字列内の要素を持つ配列を返します。

二重アンダースコアがその特定のケースで空の別の値を隠すことがあるので、これをお勧めします。

+0

アンダースコアが区切り文字であった場合、これは機能します。しかし、彼が提供した情報に基づいて、アンダースコアは区切り記号ではなく、2番目のフィールド(post_mode)の一部であるようです。 – jdias

0

最後の整数だけで問題が発生した場合は、strrchrを使用して最後の '_'で始まる文字列の「末尾」を取得できます。

+0

私は彼が文字列の最後の部分の前に常にアンダースコアがあると仮定できるとは思いません。アンダースコアは区切り記号ではなく、2番目のフィールド(post_mode)の一部であるようです。彼の解決策は、常に位置17から始まるストリングを得る。 – jdias

関連する問題