Удаление пробельных символов, кроме кавычек в PHP? - PullRequest
4 голосов
/ 29 сентября 2010

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

Вот пример:

string to parse:
hola hola "pepsi cola" yay

output:
holahola"pepsi cola"yay

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

Ответы [ 2 ]

6 голосов
/ 29 сентября 2010

Мы можем сопоставить строки или цитаты с

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

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


Пример :

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

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

echo implode('', $matches[0]);
// holahola"pepsi cola"yay
2 голосов
/ 21 мая 2014

Марти, воскрешает этот вопрос, потому что у него было простое решение, которое позволяет сделать замену за один раз - не нужно взрываться.(Нашел свой вопрос во время исследования общего вопроса о как исключить шаблоны в регулярном выражении .)

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

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

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

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

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

Ссылка

Как сопоставить (или заменить) шаблон, кроме случаев s1,s2, s3 ...

...