Есть несколько проблем с вашим регулярным выражением /style=".*(")*.*"/ig
:
Точка символа (.) Будет соответствовать чему угодно, поэтому (.) * Будет соответствовать вплоть до конца строка, пока она не увидит двойную кавычку "
Вы указываете (")*
с помощью *, поэтому она будет соответствовать любому стилю =" ... ", даже если нет (")
в стиле.
Чтобы преодолеть эту проблему, я думаю, что вам нужно указать, какие символы принимаются в style
вместе с (")
, и это может произойти любое количество раз в стиле.
Регулярное выражение вроде этого будет работать:
regexp = /style="(([a-z0-9:-]|;|\s|\(|\))*(")([a-z0-9:-]|;|\s|\(|\))*)*"/i
Лучшая версия, предложенная Тото в комментарии:
regexp = /style="([a-z0-9:;\s()-]*(")[a-z0-9:;\s()-]*)*"/i
Вот Программа, которую я пишу в Ruby, чтобы проверить это:
st = %q(
<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 "DO NOT REPLACE!"</p>
<p style="font-family:"Times New Roman" color: green;">test</p>
<p style="font-family:"Times New Roman" color: orange;">test2</p>
)
def replace_quotes_in_styles(st)
regexp = /style="(([a-z0-9:-]|;|\s|\(|\))*(")([a-z0-9:-]|;|\s|\(|\))*)*"/i
while (match_data = st.match(regexp)) do
st = st.sub(match_data.to_s, match_data.to_s.gsub(""", "'") )
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 "DO NOT REPLACE!"</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:"Times New Roman" color: red; background:url("whatever");">test1</p>
<p style="font-family:"Times New Roman" color: blue;">THIS IS CONTENT "DO NOT REPLACE!"</p>
<p style="font-family:"Times New Roman" color: green;">test</p>
<p style="font-family:"Times New Roman" color: orange;">test2</p>
)
def replace_quotes_in_styles(st)
regexp = /style="([a-z0-9:;\s()-]*(")[a-z0-9:;\s()-]*)*"/i
st.gsub(regexp) { |s| s.gsub(""", "'") }
end
puts replace_quotes_in_styles(st)