регулярные выражения js
нужно произвести замену если нет вложенного тега div , не могу придумать как сделать
spanbb = spanbb.replace(/<div class="sp-wrap">(?:[\s\S]*?)<div class="sp-body" title="([\s\S]*?)">([\s\S]*?[^(<div)])<\/div>(?:[\s\S]*?)<\/div>/img, "[spoiler=\"$1\"]$2[\/spoiler]"); т.е. [^] только для символов а не для последовательности насколько понимаю, можно ли как-то для последовательности символов сделать , с заглядыванием вперед тоже не особо получилось , кусок побольше заменяется .... <div class="sp-body" title="([\s\S]*?)">([\s\S]*?[^(<div)])<\/div> как это правильно реализовать |
Вы сами хоть понимаете, что написали?
Делайте проверку на наличие дочерних элементов, нормальным путем.. <div id="parent"> <span></span> </div> <script type="text/javascript"> window.onload = function(){ var elememt = document.getElementById('parent'); for(i=0; i<elememt.childNodes.length; i++) { var chilren = elememt.childNodes[i].tagName; if(chilren == 'SPAN'){ alert(chilren.toLowerCase()); } } }; </script> Срочно читайте: http://javascript.ru/tutorial/dom/intro http://javascript.ru/tutorial/dom/search-spec |
я прекрасно понимаю что написал , мне нужна реализация регулярными выражениями, у меня была проверка на вложенность тегов
spanbb = spanbb.replace(/<div class="sp-wrap">(?:[\s\S]*?)<div class="sp-body" title="([\s\S]*?)">([^<]*?)<\/div>(?:[\s\S]*?)<\/div>/img, "[spoiler=\"$1\"]$2[\/spoiler]");которая замечательно работала т.е. при наличии символа открытия тега "<" ([^<]*?)замена не происходила сейчас мне нужно исключить не все теги а только тег div, вот я и спрашиваю как это сделать, нужно исключить не наличие в теле спойлера символа открытия тега < , а исключить последовательность <div |
Это имете ввиду?
alert("<div class=\"sp-wrap\"><\div>".replace(/^<div.*/, '[elem]')); |
нет,
скрипт заменяет html теги на ббкод , проблема с дивами и спанами, их замену произвожу в цикле ,чтоб сначала заменялся самый вложенный, чтоб легко было отловить закрытие тега так как может быть конструкция <div...>...<div...>...</div><div> поэтому замена должна произойти если за открывающим дивом не следует еще один открывающий,т.е. ищем самый вложенный див ([^<]*?) позволял не производить замену если за открывающим дивом есть символ открытия тега , так это работало , но в диве может быть другой тег , который не влияет на дивы, поэтому перестало устраивать.. а нужно чтоб проверялось наличие последовательности <div , [^<div] не подходит , так как будет исключать не последовательность а любой из символов считаю что можно как-то средствами регулярного выражения это сделать т.е. грамотно оформить это <div>([\s\S]*?[^(<div)])</div> <div>([\s\S][^(<div)]*?)</div> т.е. совпадение должно быть найдено и переменная сохранена , если между открывающимся и закрывающимся дивом ( символы между дивами любые , включая разрыв строки , количество не известно, поиск ленивый ( до первого закрывающегося дива)) не будет открывающиегося дива сейчас думаю делать через функцию ,т.е. при совпадении будет выполнятся функция в которой и будет проверятся test'ом наличие дива в переменной, function finddiv(str, p1, p2, offset, s) { var divreg = /<div/i if (divreg.test(p2)){ //если див есть восвращаем исходное состояние return spanbb } else { //если дива нет то return "[spoiler="+p1+"]"+p2+"[/spoiler] } } spanbb = spanbb.replace(/<div class="sp-wrap">(?:[\s\S]*?)<div class="sp-body" title="([\s\S]*?)">([\s\S](*?)<\/div>(?:[\s\S]*?)<\/div>/img, finddiv); |
Часовой пояс GMT +3, время: 04:51. |