2010-09-29 4 views
4

Мне нужно удалить все пробелы из строки, но цитаты должны оставаться такими, какими они были.Удаление пробельных символов, кроме внутренних кавычек в PHP?

Вот пример:

string to parse: 
hola hola "pepsi cola" yay 

output: 
holahola"pepsi cola"yay 

Любая идея? Я уверен, что это можно сделать с помощью регулярного выражения, но любое решение в порядке.

+0

Может двойные кавычки экранировать кавычки, или это не-isse (например, «hola hola» pepsi «cola» yay' станет «holahola» pepsi \ «cola» yay' или «hola hola» pepsi \ «cola» yay')? – Wrikken

ответ

5

Мы могли бы сопоставить строки или цитаты с

[^\s"]+|"[^"]*" 

Таким образом, мы просто должны preg_match_all и сцепить результат.


Example:

$str = 'hola hola "pepsi cola" yay'; 

preg_match_all('/[^\s"]+|"[^"]*"/', $str, $matches); 

echo implode('', $matches[0]); 
// holahola"pepsi cola"yay 
2

Мартти, воскрешая этот вопрос, потому что это было простое решение, которое позволяет выполнять замену в одном идут-нет необходимости в Implode. (Найден на ваш вопрос, делая некоторые исследования для общего вопроса о how to exclude patterns in regex.)

Вот наше простое регулярное выражение:

"[^"]*"(*SKIP)(*F)|\s+ 

Левая сторона чередовании соответствует полной "quoted strings" то намеренно не удается. Правая сторона соответствует символам пробела, и мы знаем, что они являются правильными символами пробела, потому что они не соответствовали выражению слева.

Этот код показывает, как использовать регулярные выражения (см результаты в нижней части online demo):

<?php 
$regex = '~"[^"]*"(*SKIP)(*F)|\s+~'; 
$subject = 'hola hola "pepsi cola" yay'; 
$replaced = preg_replace($regex,"",$subject); 
echo $replaced."<br />\n"; 
?> 

Reference

How to match (or replace) a pattern except in situations s1, s2, s3...

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