Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярные выражения (https://javascript.ru/forum/misc/53159-regulyarnye-vyrazheniya.html)

palan 23.01.2015 11:49

Регулярные выражения
 
Помогите с регулярным выражением.
Нужно заменить подстроку 0.5pt на 1px только в подстроке
border-width: 0.5pt 0.5pt 0.5pt 0px;

Пример приведенный ниже заменяет во всем тексте:

'<td width="82" style="border-width: 0.5pt 0.5pt 0.5pt 0px; border-style: solid solid solid none;>Размер 0.5pt не соответствует</td>'.replace(new RegExp("0.5pt",'g'), '1px')



Для чего нужна замена: дело в том что border 0.5pt не отображается в Google Chrome, в IE11 - отображается. Может как то можно решить вопрос без замены?

ruslan_mart 23.01.2015 11:58

0.5pt - это 0.6665px. И как ты себе представляешь половину пикселя?

danik.js 23.01.2015 12:05

То есть вы, разработчики сайта, напортачили в шаблоне, и теперь пытаетесь исправить ошибку через javascript? Гениально просто ))

losos100 23.01.2015 13:15

alert(
'<td width="82" style="border-width: 0.5pt 0.5pt 0.5pt 0px; border-style: solid solid solid none;>Размер 0.5pt не соответствует</td>'
.replace(/:[^;]+/, function(x){return x.replace(/0.5pt/g, "1px")})
)

palan 23.01.2015 14:03

losos100 Спасибо большое, ответ по существу.

Для остальных выдумщиков: скопируйте в буфер обмена данные из MS Exsel и прочитайте из буфера в браузере EI в виде html, тогда вы поймете откуда эти "шаблоны" берутся и 0.5pt интерпритируються в EI11

danik.js 23.01.2015 14:09

Цитата:

Сообщение от palan
скопируйте в буфер обмена данные из MS Exsel

Очищаешь код от стилей (есть такая кнопка в редакторе, или пишешь сам), пишешь нужные в css - все прекрасно. Но для тебя это будет слишком сложно, так что довольствуйся предложенным костылем ))

losos100 23.01.2015 14:12

danik.js,
То есть настоящие мужЫки пишут 1000 строк вручную вместо одного реплейса?

danik.js 23.01.2015 14:40

Настоящие мужыки устраняют причину, а не последствия :)

ruslan_mart 23.01.2015 15:01

Мало того, что сама проблема извращённая, так ещё и с самим её решением наговнокодили. :) Зачем парсить весь HTML тэг, когда можно напрямую в стиль достучаться через td.style.borderWidth? И почему регулярка двойная? Одной никак?

losos100 23.01.2015 15:17

Ruslan_xDD,
Вот мой вариант для затравки
alert(
'<td width="82" style="border-width: 0.5pt 0.5pt 0.5pt 0px; border-style: solid solid solid none;>Размер 0.5pt не соответствует</td>'
.replace(/(?=[^]*;)0.5pt/g, "1px")
)

твой ход

d.skuratovich 23.01.2015 15:20

losos100, не пойдет ни одна из твоих предложенный

losos100 23.01.2015 15:22

d.skuratovich,
наша ваша верит, наша глупей.

d.skuratovich 23.01.2015 15:23

losos100, а теперь представь ситуацию, что перед border-width есть еще одно свойство с заданным 0.5pt
В таком случае, твои варианты не будут работать

d.skuratovich 23.01.2015 15:24

losos100, дурацкая у тебя манера, лишь бы быстрее ответ написать, а работает он или нет не важно!

ruslan_mart 23.01.2015 15:26

<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>
    
    <table>
      <tbody>
        <tr>
          <td id="test" width="82" style="border-width: 0.5pt 0.5pt 0.5pt 0px; border-style: solid solid solid none;">Размер 0.5pt не соответствует</td>
        </tr>
      </tbody>
    </table>

    <script>
      var test = document.getElementById('test');
      alert( test.style.borderWidth.replace(/0\.5pt/g, '1px') );
    </script>

  </body>
</html>

ruslan_mart 23.01.2015 15:40

Цитата:

Сообщение от danik.js
То есть вы, разработчики сайта, напортачили в шаблоне, и теперь пытаетесь исправить ошибку через javascript? Гениально просто ))

Ага, а кто-то ведь не понимает в этом ничего и заплатит за это деньги. :) Ох, если бы заказчик только знал, какой плохокодинг тут творится, но увы, он 100% в этом ничего не понимает.
Пожалуй, начну с того, что:
1. Таблица (table) устарела. Вместо неё либо делать дивами, либо флексбоксами. Хотя я больше чем уверен, что там можно вообще без таблицы обойтись.
2. Атрибут width устарел и приведёт к невалидному коду.
3. Border с шириной 0.666px (0.5pt) не может быть, он будет преобразован в 1px.
4. Получать outerHTML ячейки и парсить стили - изврат, ведь можно на прямую достучаться к стилям через elem.style.
5. Сама реализация писать всё в тэге style - убогость, для этого ведь придумали классы.

d.skuratovich 23.01.2015 17:05

palan, вот есть один вариант. Он будет затрагивать только свойство border-width

'width: 0.5pt; border-width: 0.5pt 1px 0.5pt; height: 0.5pt;'.replace(/(border-width.*?(0.5pt);)/, function (a, b) {
 return b.replace(/(0.5pt)/gim, '1px');
});


Вернет:
"width: 0.5pt; border-width: 1px 1px 1px; height: 0.5pt;"


Но его проблема в том, что здесь все равно двойная замена


Часовой пояс GMT +3, время: 19:37.