Я пытаюсь удалить пробел ТОЛЬКО между кавычками, например:
$text = 'good with spaces "here all spaces should be removed" and here also good';
может кто-нибудь помочь с рабочим кодом? Я уже пробовал:
$regex = '/(\".+?\")|\s/';
или же
$regex = '/"(?!.?\s+.?)/';
безуспешно, и я нашел образец, который работает не в том направлении :-( Удаление пробелов, кроме кавычек в PHP?, но я не могу его изменить.
спасибо Newi
Какого результата вы ожидаете?
Я думаю, ОП хочет превратить $text = 'good with spaces "here all spaces should be removed" and here also good'; в $text = 'good with spaces "hereallspacesshouldberemoved" and here also good';






См. Следующий фрагмент кода:
<?php
$text = 'good with spaces "here all spaces should be removed" and here also good';
echo "$text \n";
$regex = '/(\".+?\")|\s/';
$regex = '/"(?!.?\s+.?)/';
$text = preg_replace($regex,'', $text);
echo "$text \n";
?>
Я нашел образец, который работает не в том направлении :-(
$text = 'good with spaces "here all spaces should be removed" and here also good'
should be
$text = 'good with spaces "hereallspacesshouldberemoved" and here also good';
Подобные наблюдения лучше всего проводить при редактировании исходного вопроса; ответы предназначены для предложения рабочих решений вопроса.
ВАУ ... ЭТО РАБОТАЕТ ... отлично :-))))) СПАСИБО
Если ответ работает, вы должны принять его и проголосовать за него.
Подобные проблемы легко решаются с помощью preg_replace_callback. Идея состоит в том, чтобы извлечь подстроку между кавычками, а затем отредактировать ее в функции обратного вызова:
$text = preg_replace_callback('~"[^"]*"~', function ($m) {
return preg_replace('~\s~', '#', $m[0]);
}, $text);
Это самый простой способ.
С preg_replace сделать это с одним шаблоном сложнее, но возможно:
$text = preg_replace('~(?:\G(?!\A)|")[^"\s]*\K(?:\s|"(*SKIP)(*F))~', '#', $text);
Детали рисунка:
(?:
\G (?!\A) # match the next position after the last successful match
|
" # or the opening double quote
)
[^"\s]* # characters that aren't double quotes or a whitespaces
\K # discard all characters matched before from the match result
(?:
\s # a whitespace
|
" # or the closing quote
(*SKIP)(*F) # force the pattern to fail and to skip the quote position
# (this way, the closing quote isn't seen as an opening quote
# in the second branch.)
)
В этом случае используются якоря \G, чтобы гарантировать, что все совпадающие пробелы находятся между кавычками.
Пограничные случаи:
есть открывающая цитата: в этом случае заменяются все пробелы от последней кавычки до конца строки. Но если вы хотите, вы можете изменить это поведение, добавив опережающий взгляд, чтобы проверить, существует ли закрывающая цитата:
~(?:\G(?!\A)|"(?=[^"]*"))[^"\s]*\K(?:\s|"(*SKIP)(*F))~
двойные кавычки могут содержать экранированные двойные кавычки, которые необходимо игнорировать: вы должны описывать экранированные символы следующим образом:
~(?:\G(?!\A)|")[^"\s\\\\]*+(?:\\\\\S[^"\s\\\\]*)*+(?:\\\\?\K\s|"(*SKIP)(*F))~
Другая стратегия, предложенная @revo: проверьте, является ли количество оставшихся котировок в позиции нечетным или четным, используя опережающий просмотр:
\s(?=[^"]*+(?:"[^"]*"[^"]*)*+")
Это короткий шаблон, но он может быть проблематичным с длинными строками, поскольку для каждой позиции с пробелом вы должны проверять строку до последней кавычки с опережением.
Покажите, что вы уже пробовали, даже если это не сработало.