Регулярное выражение отрицания

У меня есть регулярное выражение для минимизации результата кода, сгенерированного компилятором представлений Laravel. Регулярное выражение не делает ничего, кроме минимизации HTML при компиляции представления. У меня возникли проблемы с настройкой регулярного выражения для игнорирования атрибутов, начинающихся с «:» и «@» (например, ... @click = "hide(true)" :class = "{collapsed: !open}">), так как alpinejs использует их.

В HTML-коде:

<select
                                        id = "version-switcher"
                                        :class = "{test: true}"
                                        aria-label = "Localhost version"
                                        class = "appearance-none"
                                        @change = "window.location = $event.target.value"
                                    >
                                                                                    <option  value = "https://localhost">Test</option>
                                                                                    <option selected value = "https://localhost">Foo</option>
                                                                            </select>

Результат должен быть:

<select id = "version-switcher" :class = "{test: true}" aria-label = "Localhost version" class = "appearance-none" @change = "window.location = $event.target.value"><option value = "https://localhost">Test</option><option selected value = "https://localhost">Foo</option></select>

Однако вывод:

<select id = "version-switcher":class = "{test: true}" aria-label = "Localhost version" class = "appearance-none"@change = "window.location = $event.target.value"><option value = "https://localhost">Test</option><option selected value = "https://localhost">Foo</option></select>

Обратите внимание, что атрибут, начинающийся с :, и атрибут, начинающийся с @, не отделены от предыдущего атрибута. Регулярное выражение: return preg_replace('/<!--(.*?)-->|\s\B/um', '', $html);

Может кто-нибудь помочь мне с этой проблемой, пожалуйста?

попробуй заменить \B на [\B@:]

apokryfos 03.05.2022 08:35

В этом случае [\B@:] использовать нельзя.

Mauricio Mendoza 03.05.2022 11:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
3
2
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Может быть, не идеально, но это может подойти вам:

\s(?=[\s])

Проверьте это здесь: https://regex101.com/r/RADUyp/1

Ответ принят как подходящий

Ты можешь использовать

preg_replace('~<!--[^-]*(?:-(?!->)[^-]*)*-->|\s+(?=\s[@:]?\w[\w-]*=|[<>])~u', '', $text)

См. демонстрация регулярных выражений.

Подробности:

  • <!--[^-]*(?:-(?!->)[^-]*)*--> - строка <!--, затем ноль или более символов, отличных от -, затем ноль или более повторений -, за которыми сразу не следует ->, а затем ноль или более символов без дефиса
  • | - или
  • \s+ - один или несколько пробелов
  • (?=\s[@:]?\w[\w-]*=|[<>]) - за которыми сразу следует
    • \s[@:]?\w[\w-]*= - пробел, необязательный @ или :, символ слова, ноль или более слов или символов -, а затем символ =
    • | - или
    • [<>] - символ < или >.

Отличное решение, друг Виктор Стрибижев! Он добился того же результата, но по-другому и с несколькими линиями (что мне не нравится). Мое решение было: $pattern = [ '/<!--(.*?)-->|\s\B/', '/<(.*?)>\s+/', '/([@:][a-zA-Z\d-]+=[\"\'][^\"\']*[\"\']\s*)/']; $replacement = [ '', '<$1>', ' $1$2'];. Ваше решение намного проще. Благодарю вас!

Mauricio Mendoza 04.05.2022 05:14

@MauricioMendoza Обратите внимание, что мои комментарии, соответствующие регулярному выражению, написаны с помощью принцип «развернуть петлю», поэтому это, вероятно, не так просто, но довольно эффективно. \s\B или \s(?=\s) неверны, так как они удаляют пробелы и внутри значений, а не только между элементами разметки.

Wiktor Stribiżew 04.05.2022 09:16

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