2016-10-28 8 views
0

У меня есть строка в переменнойКак предотвратить некоторые символы в дифферента функции в PHP

$str = '"100 \""'; 

Я хочу использовать декоративную функцию обрезки '"' (двойные кавычки), кроме того, после экранирующего символа.

$str = trim($str, '"'); 

Но урезает все двойные кавычки, Так может кто-нибудь сказать мне, как я могу предотвратить это? В любом случае я написал для себя свою собственную функцию обрезки, но хочу использовать стандартную функцию API в php.

+2

'preg_replace' - это то, что вы ищете. Однако попробуйте написать собственное регулярное выражение. Если вы застряли, обновите свой вопрос, детализируя, что вы пробовали. –

+0

Как выглядит ваша функция триммера? Чтобы избежать получения того же решения здесь ... – jeroen

+0

Простым методом было бы обрезать все кавычки и добавить их еще раз, если последний символ в вашей строке является обратным слэшем. Во всяком случае, с помощью regex намного чище – ByteHamster

ответ

2

Хорошо, я буду кусать. То, что вам нужно использовать, - это отрицательный lookbehind в регулярном выражении. Выражение, в его простейшей форме будет выглядеть следующим образом:

/(?<!\\)"/ 

Разбивка:

  • (?<!: Отрицательный просмотра назад. Это означает, что вы хотите проверить, что выражение не предшествует определенный шаблон:
  • \\): шаблон просмотра назад. В этом случае шаблон будет соответствовать только, если ему не предшествует буква \.
  • ": Литерал ". Опять же, из-за lookbehind вы не будете сопоставлять двойные кавычки, которые экранированы.

demo

В вашем случае, вы, вероятно, ищете:

$str = preg_replace('/(?<!\\)"/', '', $str); 

Замена всех ", не прибежит с пустой строкой (по существу, извлекая их).


Поскольку вы используете trim, вы можете только удалить ведущие и завершающие кавычки. В этом случае, вам придется изменить Выражение только чуть-чуть, и использовать это:

/(?<!\\)(^"|"$)/ 

Разбивка:

  • (?<!\\): такие же, как и раньше (отрицательный просмотра назад)
  • (^"|"$): все еще сопоставляя буква ", но только если это начало или конец строки.

Конечно, вы на самом деле не нужны для просмотра назад ведущей цитаты, так что это выражение будет работать так же хорошо (если не лучше):

/(^"|(?<!\\)"$)/ 

Разбивка:

  • ^": Совпадает с первым символом в строке, если он не создан ".
  • (?<!\\): тот же старый негативный касательно предшествующего текста
  • "$: Матчи кавычку в конце строки (только если он не предшествует \, согласно отрицательного просмотра назад

Оба этих регулярных выражений позволит обрабатывать строки, как это:

$str = '"foo"bar\""'; 
echo preg_replace('/(^"|(?<!\\)"$)/', '', $str); 

выход foo"bar\"

Demo II

+0

вы уверены, что ваше регулярное выражение работает, оно дает null в моем случае –

+0

@KshitijYelpale: Я добавил 2 демонстрационных ссылки, где показано, что регулярное выражение работает как ожидалось –

0

Попробуйте заменить регулярное выражение отрицательным lookbehind. Некоторое выражение вроде этого должно сделать трюк:

(?<!\\)" 

 Смежные вопросы

  • Нет связанных вопросов^_^