2016-10-20 4 views
2

У меня есть текстовый файл, как это:Как использовать preg_replace для замены текстов вне двойной одинарной кавычки?

ip_rule '100 120 16.54' 
qos_rule '8074 4462' 
info 'Updated on 2015' 

И я хочу, чтобы текст был так:

ip_rule='100 120 16.54' 
qos_rule='8074 4462' 
info='Updated on 2015' 

Так он заменяет только пространства за пределами '' и изменить их в знак равенства =. Как я могу это сделать с PHP, я попытался заменить их str_replace, но он заменяет все пробелы.

+0

Спасибо, это работает! – hillz

+0

читайте файл по строкам и заменяйте только первое место. –

ответ

1

Вы можете использовать (*SKIP)(*FAIL), чтобы пропустить правило. Например, в текущем примере это будет пропускать что-либо в одинарные кавычки, то найти горизонтальные пробелы (если может быть несколько, и он должен быть заменен только с одним = с использовать + квантор):

'.*?'(*SKIP)(*FAIL)|\h 

Demo: https://regex101.com/r/umaQdY/1

PHP Использование:

echo preg_replace("/'.*?'(*SKIP)(*FAIL)|\h/", '=', "ip_rule '100 120 16.54' 
qos_rule '8074 4462' 
info 'Updated on 2015'"); 

PHP Демо: https://eval.in/663922

Вы можете узнать больше об этом здесь, http://www.rexegg.com/regex-best-trick.html#pcrevariation.

+0

Я чувствую, что это может быть немного перебор в этом конкретном случае. Только 'preg_replace ("/^ (\ S +) \ s + (. *) $/M "," $ 1 = $ 2 ", $ input)' будет делать. –

+0

@NiettheDarkAbsol Да, это было бы более эффективно. Я не уверен, есть ли другие форматы OP. Мое решение состояло в том, чтобы разрешить «тексты вне двойной одинарной кавычки». Если это такой статический формат, можно просто использовать 'str_replace (" '"," =' ", $ string);'. – chris85