Regex - заменить закодированные кавычки внутри атрибута стиля - PullRequest
1 голос
/ 21 февраля 2020

Мне нужна помощь в написании регулярного выражения для анализа строки HTML для замены закодированных кавычек внутри атрибута style. В моей строке HTML есть содержимое, содержащее ту же закодированную кавычку, которую НЕ следует заменять (не внутри тегов стиля). Вот мой неудавшийся RegEx:

/style=".*(")*.*"/ig

Очевидно, это неправильно, потому что у меня очень мало навыков, когда дело доходит до RegEx. Например, вот что я пытаюсь заменить:

<p style="font-family:&quot;Times New Roman&quot; color: red; background:url(&quot;whatever&quot;);">test1</p><p style="font-family:&quot;Times New Roman&quot; color: blue;">THIS IS CONTENT &quot;DO NOT REPLACE!&quot;</p><p style="font-family:&quot;Times New Roman&quot; color: green;">test</p><p style="font-family:&quot;Times New Roman&quot; color: orange;">test2</p>

Мой желаемый результат:

<p style="font-family:'Times New Roman' color: red; background:url('whatever');">test1</p><p style="font-family:'Times New Roman'; color: blue;">THIS IS CONTENT &quot;DO NOT REPLACE!&quot;</p><p style="font-family:'Times New Roman' color: green;">test</p><p style="font-family:'Times New Roman' color: orange;">test2</p>

Следует заменить все экземпляры &quot;, которые находятся внутри style="…" , но не в области содержимого тегов HTML. Любая помощь здесь с благодарностью!

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Есть несколько проблем с вашим регулярным выражением /style=".*(&quot;)*.*"/ig:

  • Точка символа (.) Будет соответствовать чему угодно, поэтому (.) * Будет соответствовать вплоть до конца строка, пока она не увидит двойную кавычку "

  • Вы указываете (&quot;)* с помощью *, поэтому она будет соответствовать любому стилю =" ... ", даже если нет (&quot;) в стиле.

Чтобы преодолеть эту проблему, я думаю, что вам нужно указать, какие символы принимаются в style вместе с (&quot;), и это может произойти любое количество раз в стиле.

Регулярное выражение вроде этого будет работать:

regexp = /style="(([a-z0-9:-]|;|\s|\(|\))*(&quot;)([a-z0-9:-]|;|\s|\(|\))*)*"/i

Лучшая версия, предложенная Тото в комментарии:

regexp = /style="([a-z0-9:;\s()-]*(&quot;)[a-z0-9:;\s()-]*)*"/i

Вот Программа, которую я пишу в Ruby, чтобы проверить это:

st = %q(
  <p style="font-family:&quot;Times New Roman&quot; color: red; background:url(&quot;whatever&quot;);">test1</p>
  <p style="font-family:&quot;Times New Roman&quot; color: blue;">THIS IS CONTENT &quot;DO NOT REPLACE!&quot;</p>
  <p style="font-family:&quot;Times New Roman&quot; color: green;">test</p>
  <p style="font-family:&quot;Times New Roman&quot; color: orange;">test2</p>
  )

def replace_quotes_in_styles(st)
  regexp = /style="(([a-z0-9:-]|;|\s|\(|\))*(&quot;)([a-z0-9:-]|;|\s|\(|\))*)*"/i

  while (match_data = st.match(regexp)) do
    st = st.sub(match_data.to_s, match_data.to_s.gsub("&quot;", "'") )
  end

  st
end

puts replace_quotes_in_styles(st)

Она выведет вывод, подобный этому:

<p style="font-family:'Times New Roman' color: red; background:url('whatever');">test1</p>
<p style="font-family:'Times New Roman' color: blue;">THIS IS CONTENT &quot;DO NOT REPLACE!&quot;</p>
<p style="font-family:'Times New Roman' color: green;">test</p>
<p style="font-family:'Times New Roman' color: orange;">test2</p>

Или более краткая программа:

 st = %q(
  <p style="font-family:&quot;Times New Roman&quot; color: red; background:url(&quot;whatever&quot;);">test1</p>
  <p style="font-family:&quot;Times New Roman&quot; color: blue;">THIS IS CONTENT &quot;DO NOT REPLACE!&quot;</p>
  <p style="font-family:&quot;Times New Roman&quot; color: green;">test</p>
  <p style="font-family:&quot;Times New Roman&quot; color: orange;">test2</p>
  )

def replace_quotes_in_styles(st)
  regexp = /style="([a-z0-9:;\s()-]*(&quot;)[a-z0-9:;\s()-]*)*"/i
  st.gsub(regexp) { |s| s.gsub("&quot;", "'") }
end

puts replace_quotes_in_styles(st)
0 голосов
/ 21 февраля 2020

А как насчет следующего PCRE?

/(?>style=")([^"]*?)&quot;(.*?)&quot;/g

Строка подстановки должна быть \1'\2'. Проверьте это здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...