2016-05-16 5 views
0

Мне нужно удалить« -s, что делает неверный json, как это сделать в php regex?php regex Удалить «-s from string

"имя": "Стейк "аи четырех"",

в этой ситуации REMOVE "а.е. Четыре" -s "цитирует

+0

Я отформатировал ваш вопрос, чтобы он был более читабельным. У вас есть код, который вы уже пробовали? Вы также должны опубликовать это здесь, используя ссылку редактирования по вашему вопросу. – ib11

ответ

0

Это код PHP, чтобы соответствовать две цитаты в цитате:

$re = "/^\"name\": \"[^\"]*?(\")*?[^\"]*?(\")*?[^\"]*?\"$/"; 
$str = "\"Steak \"au Four\" \""; 

preg_match($re, $str, $matches); 

Sample demo here

+0

он работает, но «имя:» должно быть в regex, вы можете сделать это со мной, я новичок –

+0

@NaomiNaomi Я добавил это к началу сейчас. Но вы понимаете, что это заменяет только одну пару кавычек после этой строки «имя»: «** здесь **' »' – ib11

+0

(я также сделал это необязательным сейчас.) Я согласен, хотя с ответом @ sevavietl ниже, чтобы попытаться используйте 'str_replace()', который заменит все экземпляры кавычек в 'value'. – ib11

1

Там нет смысла матча кавычки с регулярным выражением для замены, потому что единственное, что вы в конечном итоге получите, это сами кавычки.

На самом деле, это не совсем так, как вы можете получить их вместе с индексами, передавая PREG_OFFSET_CAPTURE в качестве четвертого параметра в preg_match() (вы можете увидеть в documentation).

Но, если есть более двух двойных котировок. В этом случае регулярное выражение будет более сложным. Затем вы преобразуете строку в массив с помощью str_split(), чтобы вы могли отключить элементы по индексу. И, наконец, преобразуйте массив в строку снова с join() или implode(), объединив элементы вместе.

Мне кажется, что проще взять всю ценность, а затем заменить котировки str_replace(). В вас случае вы можете сделать что-то вроде этого:

$jsonLine = "\"name\":\"Steak \"au Four\" \""; 
$jsonLine = trim($jsonLine); 

$pattern = '/^(?P<name>"name"\s*:\s*)(?P<value>".*".*")$/'; 

if (preg_match($pattern, $jsonLine, $matches) === false) { 
    exit('Pattern not matched'); 
} 

$name = $matches['name']; 
$value = trim(str_replace('"', '', $matches['value'])); 

$newJsonLine = "$name\"$value\""; 

echo $newJsonLine; 

Вы можете увидеть демо here.