Замените пробелы внутри "", preg_replace php - PullRequest
1 голос
/ 10 марта 2012

У меня есть несколько таких строк:

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";

И я хотел бы знать, как я мог бы заменить эту строку: "Ovo de Andre" на что-то вроде этого:

"Ovo_de_Andre", но он не может изменить пробелы, которые могут быть "".

Я пытался:

$ string = preg_replace('/"(.?)\s(.?)"/m', '"$ 1_ $ 2"', $ string);

Ноон просто заменяет первый пробел, тогда строка выглядит так:

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";

Я знаю, что мог бы потратить некоторое время, чтобы проверить его, но это было бы проблематично с производительностью, и я думаю, что это было бы излишним.

Кроме того, я хочу знать, как можно сделать то же самое, но вместо замены пробелов внутри "", заменить их без пробелов внутри "".

Заранее спасибо.


У меня есть эта ссылка, которая делает что-то похожее, но я не смог справиться с тем, что изменение дало мне то, что я хочу: Использование preg_replace для замены всех вхождений в php .

Вот полные данные, я разделил их на строки, чтобы проверить одну за другой на наличие ошибок, которые были там.

$ string = 'a: 16: {';$ string. = 'i: 0; a: 5: {s: 2: "id"; s: 4: "1113"; s: 5: "iName"; s: 5: "Drops"; s: 10:"dropChance"; s: 4: "7500"; s: 4: "тип", я: 1; s: 5: "kName"; s: 5: "капли";} ";$ string. = 'i: 1; a: 5: {s: 2: "id"; s: 4: "1585"; s: 5: "iName"; s: 11: "Mime Monkey"; s: 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:"dropChance"; s: 4: "7000"; s: 4: "тип", я: 1; s: 5: "kName"; s: 7: "Raptice";} ";$ string. = 'i: 3; a: 5: {s: 2: "id"; s: 4: "1002"; s: 5: "iName"; s: 6: "Poring"; s: 10:"dropChance"; s: 4: "7000"; s: 4: "тип", я: 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: "тип"; я: 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: "тип"; я: 2; s: 5: "kName"; s: 8: "Deviling";} ";$ string. = 'i: 6; a: 5: {s: 2: "id"; s: 4: "1766"; s: 5: "iName"; s: 8: "Angeling"; s: 10:"dropChance"; s: 4: "5000"; s: 4: "тип"; я: 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: "тип"; я: 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: "тип", я: 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:"dropChance"; s: 4: "3000"; s: 4: "тип", я: 1; s: 5: "kName"; s: 9: "Esqueleto";} ";$ string. = '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";} ';$ string. = 'i: 12; a: 5: {s: 2: "id"; s: 4: "1051"; s: 5: "iName"; s: 14: "Besouro-Ladrão"; s:10: "dropChance"; s: 4: "2000"; s: 4: "тип", я: 1; s: 5: "kName"; s: 14: "Безоро-Ladrão";} ";$ string. = '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";} ';
$ string. = 'i: 14; a: 5: {s: 2: "id"; s: 4: "1011"; s: 5: "iName"; s: 8: "ChonChon"; s: 10: "dropChance""; s: 4:" 1500 "; s: 4:" тип "я: 1; s: 5:" kName "; s: 8:" чончон ";}";$ string. = 'i: 15; a: 5: {s: 2: "id"; s: 4: "1784"; s: 5: "iName"; s: 5: "Stapo"; s: 10:"dropChance"; s: 4: "1000"; s: 4: "тип", я: 1; s: 5: "kName"; s: 5: "Stapo";} ";$ string. = '}';

Если посмотреть внимательно, вы заметите в строках i: 0 и i: 11 вектора некоторые пробелы между данными, которые показывают, какой номер строкии размер данных существует.

Ответы [ 3 ]

2 голосов
/ 11 марта 2012

Это должно работать:

$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";

Вкратце это регулярное выражение находит пробел, который равен NOT , за которым следует четное число двойных кавычек, что означает, что найденное пространство находится в двойных кавычках, следовательно, оно заменяется недооценкой.

ВЫХОД:

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 голос
/ 11 марта 2012

Редактировать: 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 голосов
/ 11 марта 2012

Я бы по возможности избегал использования регулярных выражений, потому что вы можете легко десериализовать и прочитать значение, а затем сериализовать его обратно.Это гарантирует, что вы точно знаете, что вы изменяете.

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

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