#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);
.