У меня есть регулярное выражение для минимизации результата кода, сгенерированного компилятором представлений 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@:] использовать нельзя.
Может быть, не идеально, но это может подойти вам:
\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'];
. Ваше решение намного проще. Благодарю вас!
@MauricioMendoza Обратите внимание, что мои комментарии, соответствующие регулярному выражению, написаны с помощью принцип «развернуть петлю», поэтому это, вероятно, не так просто, но довольно эффективно. \s\B
или \s(?=\s)
неверны, так как они удаляют пробелы и внутри значений, а не только между элементами разметки.
попробуй заменить
\B
на[\B@:]