Хорошо, я буду кусать. То, что вам нужно использовать, - это отрицательный lookbehind в регулярном выражении. Выражение, в его простейшей форме будет выглядеть следующим образом:
/(?<!\\)"/
Разбивка:
(?<!
: Отрицательный просмотра назад. Это означает, что вы хотите проверить, что выражение не предшествует определенный шаблон:
\\)
: шаблон просмотра назад. В этом случае шаблон будет соответствовать только, если ему не предшествует буква \
.
"
: Литерал "
. Опять же, из-за lookbehind вы не будете сопоставлять двойные кавычки, которые экранированы.
В вашем случае, вы, вероятно, ищете:
$str = preg_replace('/(?<!\\)"/', '', $str);
Замена всех "
, не прибежит с пустой строкой (по существу, извлекая их).
Поскольку вы используете trim
, вы можете только удалить ведущие и завершающие кавычки. В этом случае, вам придется изменить Выражение только чуть-чуть, и использовать это:
/(?<!\\)(^"|"$)/
Разбивка:
(?<!\\)
: такие же, как и раньше (отрицательный просмотра назад)
(^"|"$)
: все еще сопоставляя буква "
, но только если это начало или конец строки.
Конечно, вы на самом деле не нужны для просмотра назад ведущей цитаты, так что это выражение будет работать так же хорошо (если не лучше):
/(^"|(?<!\\)"$)/
Разбивка:
^"
: Совпадает с первым символом в строке, если он не создан "
.
(?<!\\)
: тот же старый негативный касательно предшествующего текста
"$
: Матчи кавычку в конце строки (только если он не предшествует \
, согласно отрицательного просмотра назад
Оба этих регулярных выражений позволит обрабатывать строки, как это:
$str = '"foo"bar\""';
echo preg_replace('/(^"|(?<!\\)"$)/', '', $str);
выход foo"bar\"
'preg_replace' - это то, что вы ищете. Однако попробуйте написать собственное регулярное выражение. Если вы застряли, обновите свой вопрос, детализируя, что вы пробовали. –
Как выглядит ваша функция триммера? Чтобы избежать получения того же решения здесь ... – jeroen
Простым методом было бы обрезать все кавычки и добавить их еще раз, если последний символ в вашей строке является обратным слэшем. Во всяком случае, с помощью regex намного чище – ByteHamster