0

私はこのような文字列を持っています

$str="absdbsasd k=12312 sdasd l=89879 m=ken asddq casdasd"

出力は次のようになります

問題は、変数 $str の文字列を処理して、このような出力を取得する方法です

k=12312
l=89879
m=ken asddq casdasd

スペース文字 (' ') を '&' に置き換えた後に parse_str を実装しようとしましたが、出力はまだ間違った答えを得ました

k=12312
l=89879
m=ken

誰か助けてくれませんか..

4

2 に答える 2

0

論理的には、識別子は a で終わる単語の文字であり=、値は次の識別子が来ると終了しますが、値が数字で始まる場合、値に必要な数字の最初の単語のみであると仮定すると、次のようになります。

$str="absdbsasd k=12312 sdasd l=89879 m=ken asddq casdasd";

$parts = preg_split('/(\w+=)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);

$result = array();
$prev_was_an_identifier = false;
$last_identifier = null;
foreach ($parts as $part) {
    if ($prev_was_an_identifier) {
        if (preg_match('/^\d+/', $part)) {
            $result[$last_identifier] = preg_replace('/^(\d+).*/', '$1', $part);
        } else {
            $result[$last_identifier] = $part;
        }   
        $prev_was_an_identifier = false;
    } elseif (preg_match('/=$/', $part)) {
        $prev_was_an_identifier = true;
        $last_identifier = mb_substr($part, 0, -1);
    }
}

出力:

array (
  'k' => '12312',
  'l' => '89879',
  'm' => 'ken asddq casdasd',
)
于 2012-07-30T09:12:22.757 に答える
0

まず、文字列の構造を次のように定義する必要があります。

$str = "$first_value k=$secound_value l=$third_value m=$forth_value";

構造が私が書いたとおりであれば、ある値がどこで終わり、別の値が始まるかを決定するセパレータやその他の種類の方法がないため、必要なものを取得することはほとんど不可能です。この例を見てください:

$str="absdbsasd k=12312 sdasd l=s l=8987 l=s 9 m=ken asddq casdasd"

本物がどこからl=始まるかを知る方法はありません。

(のようないくつかの区切り記号を追加'し、それらが値に表示されないようにすると、次のようなものが得られます。

$str="'absdbsasd' k='12312 sdasd l=s' l='8987 l=s 9' m='ken asddq casdasd'"

そして、preg_matchまたはpreg_splitチェックを実行して、目的の値を取得できます。

または、最初に配列を作成することをお勧めします。

于 2012-07-30T09:13:01.897 に答える