2012-03-10 19 views
1

私はこのようないくつかの文字列を有する:"は内スペース交換"、にpreg_replaceのPHP

I:11; 5:{S:2: "ID"; S:4: "1097"; Sを:5: "iName"; s:12: "Ovo de Andre"; s:10: "dropChance"; s:4: "2000"; s:4: "type"; i:1; s:5: "kName"; s:12:「Ovo de Andre」;

そして、私はその文字列を置き換えることができるか知りたいのです:「Ovo_de_Andre」

が、それはそのスペースを変更することはできません:「OVO・デ・アンドレ」このようなものに""外に出る可能性があります。

私が試した:

$文字列=にpreg_replace( '/ "()\ S()。?。?"/M'、 ' "$ 1_ $ 2"'、$を文字列);

しかし、それはちょうどその文字列は次のようになり、最初のスペースを置き換える:

私は:11;:5:{S:2: "ID"; S:4:」 s:5: "iName"; s:12: "Ovo_de Andre"; s:10: "dropChance"; s:4: "2000"; s:4: "type"; i:1; s:5: "kName"; s:12: "Ovo_de Andre";

私はそれを確認するためにしばらく時間をとることができると知っていますが、パフォーマンスには問題があり、冗長になると思います。

また、同じようにすることができますが、 ""内のスペースを置き換えるのではなく、 ""内にスペースを入れずに置き換えることができます。

ありがとうございます。


私は似たようになりますが、私はそれは私が欲しいものを到達させるために変更すること何を管理することができませんでした。このリンクを持っている: Using preg_replace to replace all occurrences in phpを。

ここでは完全なデータですが、私は文字列で1つずつテストしてエラーを探しました。

$ string = 'a:16:{'; 0:A:5:{s:2: "id"; s:4: "1113"; s:5: "iName"; s:5: "Drops"; s:10 : "dropChance"; s:4: "7500"; s:4: "type"; i:1; s:5: "kName"; s:5: "Drops";} '; "iim"; s:11: "Mime Monkey"; s:4: "1585"; s:5: "iName"; s:11: 10: "dropChance"; s:4: "7000"; s:4: "type"; i:1; s:5: "kName"; s:11: "Mime Monkey";} ';$ string。= 'i:2; a:5:{s:2: "id"; s:4: "1027"; s:5: "iName"; s:7: "Raptice"; s:10 : "ドロップチャンス"; s:4: "7000"; s:4: "タイプ"; i:1; s:5: "kName"; s:7: "Raptice";$ string。= 'i:3; a:5:{s:2: "id"; s:4: "1002"; s:5: "iName"; s:6: "ポーリング"; s:10 : "dropChance"; s:4: "7000"; s:4: "type"; i:1; s:5: "kName"; s:6: "Poring";} ';$ string。= 'i:4; a:5:{s:2: "id"; s:4: "1767"; s:5: "iName"; s:8: "Deviling"; s:10 : "dropChance"; s:4: "5000"; s:4: "タイプ"; i:2; s:5: "kName"; s:8: "Deviling";$ string = 'i:5; a:5:{s:2: "id"; s:4: "1767"; s:5: "iName"; s:8: "deviling"; s:10 : "dropChance"; s:4: "5000"; s:4: "タイプ"; i:2; s:5: "kName"; s:8: "Deviling"; $ string。s:5: "i":s:8: "Angeling"; s:10: "dropChance" s:4: "5000"; s:4: "タイプ"; i:2; s:5: "kName"; s:8: "Angeling";$ string。= 'i:7; a:5:{s:2: "id"; s:4: "1766"; s:5: "iName"; s:8: "Angeling"; s:10 : "dropChance"; s:4: "5000"; s:4: "type"; i:2; s:5: "kName"; s:8: "Angeling";$ string。= 'i:8; a:5:{s:2: "id"; s:4: "1004"; s:5: "iName"; s:6: "Zangão"; s:10 : "dropChance"; s:4: "3500"; s:4: "type"; i:1; s:5: "kName"; s:6: "Zangão";} ';$ string。= 'i:9; a:5:{s:2: "id"; s:4: "1236"; s:5: "iName"; s:12: "Ovo de Andre"; s :10: "dropChance"; s:4: "3000"; s:4: "type"; i:1; s:5: "kName"; s:12: "Ovo de Andre";$ string。= 'i:10; a:5:{s:2: "id"; s:4: "1076"; s:5: "iName"; s:9: "Esqueleto"; s:10 s:4: "type"; i:1; s:5: "kName"; s:9: "Esqueleto";} '; 035:i:11; a:5:{s:2: "id"; s:4: "1097"; s:5: "iName"; s:12: "Ovo de Andre"; :10: "dropChance"; s:4: "2000"; s:4: "type"; i:1; s:5: "kName"; s:12: "Ovo de Andre"; 012:I:12; a:5:{s:2: "id"; s:4: "1051"; s:5: "iName"; s:14: "Besouro-Ladrão"; s:4: "タイプ"; i:1; s:5: "kName"; s:14: "Besouro-Ladrão"; i:13:a:5:{s:2: "id"; s:4: "1183"; s:5: "iName"; s:16: "ChonChon Raivoso"; s: 10: "dropChance"; s:4: "1500"; s:4: "type"; i:1; s:5: "kName"; s:16: "ChonChon Raivoso";} '; i:14:a:5:{s:2: "id"; s:4: "1011"; s:5: "iName"; s:8: "ChonChon"; s: 10: "dropChance"; s:4: "1500"; s:4: "type"; i:1; s:5: "kName"; s:8: "ChonChon";} ';$ string = 'i:15; a:5:{s:2: "id"; s:4: "1784"; s:5: "iName"; s:5: "Stapo"; s:10 s:5: "Stapo";} ';' ';' '; $ string。= '}'; 0とI:ベクトルの11のデータの行数とサイズが存在するかを示したデータの間にいくつかのスペース

もしあなたが私のラインでわかります慎重に見えました。

+2

これは、シリアル化された配列のように見える、なぜあなたが最初にそれをデシリアライズしていませんか?とにかくスペースを置き換えるだけなら、正規表現は必要ありません。 ['str_replace'](http://php.net/manual/en/function.str-replace.php)を見てください。 –

+0

str_replaceは、 ""から空白を置き換えて、完全なシリアル化されたものではないので、この文字列を破ることになるでしょう。この関数は、正しいシリアル化された文字列の外にあるスペースを削除します。 – Marcelo

+0

Ok @Marcelo - ここでは、有効なシリアライズされたオブジェクトがないことを明確にしています。私の答えは無視してください! – calumbrodie

答えて

2

これは動作するはずです:

$str = <<< EOF 
i: 11;a:5: {s:2:"id";s:4:"1097";s:5:"iName";s:12:"Ovo de Andre";s:10:"dropChance";s:4:"2000";s:4:"type"; i:1;s:5: "kName"; s:12: "Ovo de Andre" 
EOF; 
$str = preg_replace_callback('#("[^"]*")#', 
     create_function('$m', 
      'return str_replace(" ", "_", $m[1]);'), 
     $str); 
echo $str . "\n"; 

更新:OPは、単一の正規表現で、この交換を持っているのが好きのでを、ここでは負の先読みを使用していずれかになります。短いこの中

$str = preg_replace('#\s(?!([^\"]*\"[^\"]*\")*[^\"]*$)#', '_', $str); 
echo $str . "\n"; 

正規表現は、ではないのスペースを見つけます。これは、二重引用符の偶数であり、これは見つかったスペースが二重引用符hencそれはアンダースコアに置き換えられます。

OUTPUT:

i: 11;a:5: {s:2:"id";s:4:"1097";s:5:"iName";s:12:"Ovo_de_Andre";s:10:"dropChance";s:4:"2000";s:4:"type"; i:1;s:5: "kName"; s:12: "Ovo_de_Andre" 
+1

create_function? wtf – dynamic

+0

それは魅力のように働いた、ありがとう、しかし、私はそれが私はそれを行うコールバックを必要としない方法かもしれないwhish。 ちょうどこのポストのように:http://stackoverflow.com/questions/4643442/using-preg-replace-to-replace-all-occurrences-in-php – Marcelo

+0

私が15の評判ポイントを持っていたら私はあなたのために投票します。 – Marcelo

1

編集:OPは、このオブジェクトを操作する場合は

が、私はわからないんだけど...文字列が有効なシリアル化されたオブジェクトではないことを明らかにしましたそれがどこから来たのか、それがどこから来たのか、私が最初にしたことは、それがシリアル化されていないということです(シリアル化されたオブジェクトがあることを前提にしています。有効なシリアライズされたオブジェクト。帽子あなたは全体の文字列を投稿していない)。

http://www.php.net/manual/en/function.unserialize.php

あなたは、属性ごとに、あなたの変換を適用を開始することができます賢明な形式で配列を持っていたら...正規表現を使用して、オブジェクト/配列の属性に変換の塊を実行

//unserialize 
$person = unserialize($yourstring); 

// now perfrom transformations 
$person['iName'] = str_replace(' ', '_', $person['iName']); 
$person['kName'] = str_replace(' ', '_', $person['kName']); 
// etc... 

// now re-serialize 
$person = serialize($person); 

は単なる悪夢である - それは自分自身で簡単、あなたを助けるためにPHPのネイティブ機能を使用してください!

には、にシリアル化されたオブジェクトが含まれていない場合、この回答は無視されます。

+0

これは完璧なシリアライズされたオブジェクトではないので適合しません。 – Marcelo

0

可能であれば正規表現を使用しないでください。これは、簡単にシリアル化を解除して値を読み取り、シリアル化し直すことができるからです。これにより、変化していることを正確に把握することができます。

http://www.php.net/manual/en/function.unserialize.php

function space_to_underscore($str) { 
    return str_replace(' ', '_', $str); 
} 
+0

データの量を指定するdata-keyと値の開始場所の間にスペースがあるため、シリアル化を解除できません。 – Marcelo

関連する問題