Как я могу заменить все классы, начинающиеся с «border-», с помощью gsub?

Я сейчас этим занимаюсь, отлично работает

html_tag.gsub("border-gray-300", "border-red-500")

Теперь мне нужно gsub все, что следует border- с помощью border-red-500

Например border-gray-500 или border-blue-50 нужно вернуть border-red-500. Я еще плохо разбираюсь в регулярных выражениях, может кто-нибудь помочь мне начать?

Вы можете попробовать html_tag.gsub(/border-[a-z]+-\d+\b/,"border-red-500")

Prasanna 24.12.2020 08:25

Вам нужно более конкретно указать форму строк, которые вы хотите преобразовать. Я предполагаю, что все они начинаются с "border-", но как насчет "border-gray-1000", "border-yellow-1000", "border-yellow-1000", "border-Gray-500", "border-collie" и так далее. Приведение нескольких примеров не заменяет точной постановки вопроса словами. Например, вы можете заменить строки вида border-XXX-YYY, где XXX представляет <?>, а YYY представляет <?>.

Cary Swoveland 24.12.2020 08:27

@cary, единственное ограничение состоит в том, что слово должно начинаться с «border-», поэтому «border-collie» будет заменено на «border-red-500», а «focus:border-indigo-500» останется в покое.

vince 24.12.2020 15:17

Станет ли "border-collie or pug""border-red-100 or pug" или "border-red-100"? В последнем случае символ пробела имеет значение, но вы ничего не сказали об этом. Чтобы уточнить свой вопрос, лучше отредактировать вопрос, а не уточнять его в комментариях, поскольку вопросы должны стоять отдельно, отчасти потому, что не все читатели читают все комментарии.

Cary Swoveland 24.12.2020 20:08
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
4
108
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Определить выборки данных

В вашем первоначальном вопросе не хватает точности (например, мы говорим о встроенных атрибутах стиля, тегах стиля или свойствах CSS?) и действительного, проверяемого примера того, что следует включать/исключать. Итак, давайте создадим его. Например:

# here-document containing style and class tags
# that we can use as a test fixture
html_tag = <<~'INLINE_STYLES'
    <h1 style = "border-color: lightgrey;"></h1>
    <h2 class = "border-red-500"></h2>
    <h3 style = "foo; border-collie;"></h3>
    <h4 class = "focus:border-indigo-500"></h4>
    <h5 style = "border-style: 1px;"></h5>
    <h6 class = "border-collie" style = "border: 5px solid red;">border-</h6>
INLINE_STYLES

Учитывая этот пример данных, вы можете понять, почему важно определить тестовые входные данные и ожидаемые выходные данные. Что ваше выражение должно делать с border-style? Должны ли мы игнорировать его, потому что это атрибут стиля, а не класс? Или это тоже надо менять? Для этого ответа мы предположим, что вы хотите изменить только классы, а не встроенные стили, атрибуты внутри тега стиля или внешние файлы CSS.

Отличие стилей от классов

Вам, вероятно, придется немного настроить логику программы и регулярное выражение ниже на основе ваших реальных целевых данных, потому что «самая простая вещь, которая может работать», часто меняется вместе с данными. Вряд ли существует единственное каноническое решение, обрабатывающее все возможные крайние случаи.

Имея это в виду, вы можете использовать следующее с примерами данных выше:

border_class_tag =
  /
    (          # capture group \1 for replacement string
      class = "  #   class attribute with opening doublequote
      .*?      #   non-greedy match until...
    )
               # text to be replaced, a.k.a. \&
    (?<!:)     #   not immediately preceded by a colon
    border-    #   a class that starts with "border-"
    [^"]+      #   anything not a closing doublequote

    (? = ")      # immediately followed by a doublequote
  /ix  
puts html_tag.gsub border_class_tag, '\1border-red-500'

Это выведет на стандартный вывод следующее:

<h1 style = "border-color: lightgrey;"></h1>
<h2 class = "border-red-500"></h2>
<h3 style = "foo; border-collie;"></h3>
<h4 class = "focus:border-indigo-500"></h4>
<h5 style = "border-style: 1px;"></h5>
<h6 class = "border-red-500" style = "border: 5px solid red;">border-</h6>

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

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