Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   regex бессмысленный и беспощадный (https://javascript.ru/forum/misc/15266-regex-bessmyslennyjj-i-besposhhadnyjj.html)

kostysh 19.02.2011 16:05

regex бессмысленный и беспощадный
 
никак не получается составить регулярное выражение.

на входе есть какой-то текст с вкраплениями тегов и спец-символов. Что-то вроде:

какойтотекст текст<div>фывап</div><div>уцекен&nbsp; &amp;вапапв</div><div></div>блаблабла

Задача: заменить на хекс-коды все символы которые лежат за пределами тегов и не являются спец-символами

Регулярка для выбора тегов и спецсимволов простая: /<[^<]+>|&[^&]+;/g но ведь нужно то как раз наоборот :) а вот это уже никак не получается...

кое-как удалось добиться выборки текста за пределами тегов: /(?!>).(?=([^>]*<))/g но как при этом еще игнорировать спец-символы? да еще и текст за пределами крайнего правого тега не попадает в результат.

бьюсь над проблемой уже третий день. Похоже придется отказаться от регулярки и перебирать строку простым способом... а как было бы здорово..
text.replace(/супервыражение/g, function(char) {
    var code = char.charCodeAt(0);
    return '&#x' + code.toString(16) + ';';
});

Aetae 19.02.2011 16:51

лол
На правах бреда:
1.
alert( unescape( escape( 'какойтотекст  текст<div>фывап</div><div>уцекен&nbsp;   &amp;вапапв</div><div></div>блаблабла' ).replace( /%u([\dA-F]+)/g , '&#x$1;' ) ) )


2.
function convert(txt){
  var t=e=true;  
  var r=function(c){
    if(c==='<')t=false;
    if(c==='&')e=false;
    if(t&&e)c='&#x'+c.charCodeAt(0).toString(16)+';';
    if(c==='>')t=true;
    if(c===';')e=true;
    return c
  }
  return txt.replace(/./g,r)
}
alert( convert( 'какойтотекст  текст<div>фывап</div><div>уцекен&nbsp;    &amp;вапапв</div><div></div>блаблабла' ) )

Kolyaj 19.02.2011 17:51

var str = 'какойтотекст текст<div>фывап</div><div>уцекен&nbsp; &amp;вапапв</div><div></div>блаблабла';
alert(str.replace(/<[^>]+>|&[^;]+;|(.)/g, function(text, ch) {
    return ch ? '&#' + ch.charCodeAt().toString(16) + ';' : text;
}));

Aetae 19.02.2011 19:10

Мне было бы стыдно если бы не моё состояние). =)

kostysh 19.02.2011 21:23

я сегодня выпью за этого замечательного человека. Ну многое понять могу и понимаю, а как дело касается регулярных выражений - капец.

Большое спасибо за помощь! работает! (там только еще "х" добавить и будут хексы)

Aetae 19.02.2011 21:25

..или убрать '.toString(16)' =)

Kolyaj 19.02.2011 21:44

Цитата:

Сообщение от kostysh
Ну многое понять могу и понимаю, а как дело касается регулярных выражений - капец.

http://yandex.ru/yandsearch?text=%D1...id=46510&lr=16
Необходимое и достаточное чтение, чтобы не иметь проблем с регулярными выражениями.

kostysh 19.02.2011 22:42

Цитата:

Сообщение от Kolyaj (Сообщение 93232)
http://yandex.ru/yandsearch?text=%D1...id=46510&lr=16
Необходимое и достаточное чтение, чтобы не иметь проблем с регулярными выражениями.


Спасибо. уже скачал и читаю.
надеюсь закрыть эту тему раз и навсегда.


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