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

#php #regex #preg-replace

#php #регулярное выражение #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 , но он заменяет все пробелы целиком.

Комментарии:

1. Спасибо, это работает!

2. прочитайте файл построчно и замените только первое вхождение пробела.

Ответ №1:

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

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

Демо: 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 .

Комментарии:

1. Я чувствую, что это может быть немного излишним в данном конкретном случае. Просто preg_replace("/^(S )s (.*)$/m","$1=$2",$input) подойдет.

2. @NiettheDarkAbsol Да, это было бы более эффективно. Я не уверен, есть ли другие форматы в OP. Моим решением было решить texts outside double single-quote . Если это так, можно было бы просто использовать именно этот статический формат str_replace(" '", "='", $string); .