Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   регулярные выражения js (https://javascript.ru/forum/css-html/12443-regulyarnye-vyrazheniya-js.html)

smollvrn 17.10.2010 22:35

регулярные выражения 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> как это правильно реализовать

monolithed 17.10.2010 23:34

Вы сами хоть понимаете, что написали?

Делайте проверку на наличие дочерних элементов, нормальным путем..

<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

smollvrn 17.10.2010 23:59

я прекрасно понимаю что написал , мне нужна реализация регулярными выражениями, у меня была проверка на вложенность тегов
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

monolithed 18.10.2010 00:43

Это имете ввиду?
alert("<div class=\"sp-wrap\"><\div>".replace(/^<div.*/, '[elem]'));

smollvrn 18.10.2010 11:32

нет,
скрипт заменяет 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, время: 19:08.