Я сейчас этим занимаюсь, отлично работает
html_tag.gsub("border-gray-300", "border-red-500")
Теперь мне нужно gsub
все, что следует border-
с помощью border-red-500
Например border-gray-500
или border-blue-50
нужно вернуть border-red-500
. Я еще плохо разбираюсь в регулярных выражениях, может кто-нибудь помочь мне начать?
Вам нужно более конкретно указать форму строк, которые вы хотите преобразовать. Я предполагаю, что все они начинаются с "border-"
, но как насчет "border-gray-1000"
, "border-yellow-1000"
, "border-yellow-1000"
, "border-Gray-500"
, "border-collie"
и так далее. Приведение нескольких примеров не заменяет точной постановки вопроса словами. Например, вы можете заменить строки вида border-XXX-YYY
, где XXX
представляет <?>, а YYY
представляет <?>.
@cary, единственное ограничение состоит в том, что слово должно начинаться с «border-», поэтому «border-collie» будет заменено на «border-red-500», а «focus:border-indigo-500» останется в покое.
Станет ли "border-collie or pug"
"border-red-100 or pug"
или "border-red-100"
? В последнем случае символ пробела имеет значение, но вы ничего не сказали об этом. Чтобы уточнить свой вопрос, лучше отредактировать вопрос, а не уточнять его в комментариях, поскольку вопросы должны стоять отдельно, отчасти потому, что не все читатели читают все комментарии.
В вашем первоначальном вопросе не хватает точности (например, мы говорим о встроенных атрибутах стиля, тегах стиля или свойствах 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>
Это выглядит правильно для меня, учитывая ожидания и определенные образцы. Ваш пробег может отличаться.
Вы можете попробовать
html_tag.gsub(/border-[a-z]+-\d+\b/,"border-red-500")