Php -> preg_replace -> удалить пробел ТОЛЬКО между кавычками

Я пытаюсь удалить пробел ТОЛЬКО между кавычками, например:

$text = 'good with spaces "here all spaces should be removed" and here also good';

может кто-нибудь помочь с рабочим кодом? Я уже пробовал:

$regex = '/(\".+?\")|\s/';

или же

$regex = '/"(?!.?\s+.?)/';

безуспешно, и я нашел образец, который работает не в том направлении :-( Удаление пробелов, кроме кавычек в PHP?, но я не могу его изменить.

спасибо Newi

Покажите, что вы уже пробовали, даже если это не сработало.

Casimir et Hippolyte 13.05.2018 20:50

Какого результата вы ожидаете?

Onyambu 13.05.2018 20:52

Я думаю, ОП хочет превратить $text = 'good with spaces "here all spaces should be removed" and here also good'; в $text = 'good with spaces "hereallspacesshouldberemoved" and here also good';

Graham 13.05.2018 20:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
3
957
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

См. Следующий фрагмент кода:

<?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";
?>

Я нашел образец, который работает не в том направлении :-(


@Graham: correct
$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';

Подобные наблюдения лучше всего проводить при редактировании исходного вопроса; ответы предназначены для предложения рабочих решений вопроса.

Graham 13.05.2018 21:00

ВАУ ... ЭТО РАБОТАЕТ ... отлично :-))))) СПАСИБО

Newi 13.05.2018 21:05

Если ответ работает, вы должны принять его и проголосовать за него.

Graham 13.05.2018 21:06
Ответ принят как подходящий

Подобные проблемы легко решаются с помощью 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(?=[^"]*+(?:"[^"]*"[^"]*)*+")

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

Отлично. В случае отсутствия кавычек внутри кавычек может быть другой подход: \h(?=[^"]*"[^"]*+(?:"[^"]*"[^"]*)*+\z)

revo 13.05.2018 21:10

Другие вопросы по теме