2013-09-23 4 views
0

После того, как возникла проблема с созданием строки json, я обнаружил в моей базе текст, содержащий двойные кавычки. Мне нужно заменить кавычки на их экранированные эквиваленты. Это работает:Regex для замены неэкранированных котировок

function escape($str) { 
    return preg_replace('/"/',"\\\"",$str); 
} 

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

+0

Это поможет вам с другим 'regex' вопросом: http://regex101.com/r/mX0qH5 К тому времени я пошел к сообщению ... :) –

ответ

4

Вы должны использовать отрицательный здесь просмотра назад

function escape($str) { 
    return preg_replace('/(?<!\\)"/',"\\\"",$str); 
} 
+0

Эй, спасибо за это. О другом вопросе этот сайт действительно попадает ко мне иногда, все downvotes и closevotes ... все без объяснений. У меня складывается впечатление, что люди просто опустили его на чертову. Во всяком случае, извините за разглашение. Я подумал, где разместить позитивный взгляд и заставить его работать. Немного изменилось '/^.*?(?:(?} \ s *) | (? P {[! #]? \ S *)) | (? = \\ $) | $)/sm' – Twifty

+0

@Waldermort, Ах, я пропустил, что вы хотите совместить до '$' но * исключая * его. Этот взгляд имеет смысл. Приятно знать, что вы работали. –

+0

Этого недостаточно. Если перед символом '' 'предшествуют две обратные косые черты, это не ускользает. – mpen

0

Попробуйте сначала удалить «\» из всех экранированных кавычек doube, чем избежать всех двойных кавычек.

str_replace(array('\"', '"'), array('"', '\"'), $str); 
+1

Но что о тексте, например 'Hello \\" World', который предшествует экранированной косой чертой? – Twifty

0

Я считаю this will work

регулярное выражение:

(?<!\\)((?:\\\\)*)" 

кода:

$re = '/(?<!\\\\)((?:\\\\\\\\)*)"/'; 
preg_replace($re, '$1\\"', 'foo"bar'); // foo\"bar -- slash added 
preg_replace($re, '$1\\"', 'foo\\"bar'); // foo\"bar -- already escaped, nothing added 
preg_replace($re, '$1\\"', 'foo\\\\"bar'); // foo\\\"bar -- not escaped, extra slash added 
Смежные вопросы