Помогите с регулярным выражением
Здравствуйте, возникла пробема с построением регулярки. Есть переменная content, в которую я из файла считываю шаблон вида
var content='<div style="clear: both;"> </div> <script type="text/javascript">// <![CDATA[ jQuery(document).ready(function(){ jQuery("#he5").css('display','none'); jQuery('#hb5').on("click",function () { jQuery('#he5').toggle('slow'); }); }) // ]]></script>'; Нужно получить в отдельную переменную весь контетнт до тега <script> и в другую - содержиое тега <script> (то есть все то, что находится между открывающим и закрывающим тегами) Написанная регулярка не работает - выдает null( Хотя ожидался массив из 3 элементов. var htmlJsRe = new RegExp('([\w,\W]*)<script type="text\\/javascript">([\w,\W]*)<\\/script>', 'mg'); var htmlJsReArray = htmlJsRe.exec(content); Подскажите пожалуйста как ее исправить |
var content='<div style="clear: both;"> </div>\ <script type="text/javascript">([\w,\W]*)<\\/script>\', \'mg\');\ jQuery(document).ready(function(){\ \ jQuery("#he5").css("display","none");\ jQuery("#hb5").on("click",function () {\ jQuery("#he5").toggle("slow");\ });\ })\ // ]]><'+'/'+'script>'; var script = (' '+content).split(eval('/(<script[^>]*?>|<\\/script>)/igm')); var contentDoScrpt=script[0]; var teg1=script[1]; var teg2=script[3]; var contentteg=script[2]; alert(contentDoScrpt) alert(contentteg) |
Цитата:
var content='<div style="clear: both;"> </div>\ <script type="text/javascript">// <![CDATA[\ jQuery(document).ready(function(){\ \ jQuery("#he5").css("display","none");\ jQuery("#hb5").on("click",function () {\ jQuery("#he5").toggle("slow");\ });\ })\ // ]]><\/script>'; var htmlJsRe = new RegExp('([\\w\\W]*)<script type="text\/javascript">([\\w\\W]*)<\/script>', 'mg'); var htmlJsReArray = htmlJsRe.exec(content); alert(htmlJsReArray.join('\n\n\n')); |
Ошибки в выражении в исходном сообщении:
1. [\w,\W] - соответствует словному символу, запятой, несловному символу, запятая тут лишняя, она и так несловный символ. Заменяем на [\w\W] (хотя в этом случае принято использовать [\s\S]) 2. Звездочка после закрывающей квадратной скобки говорит - найти сколько угодно повторений, причем чем больше, тем лучше. Поэтому сначала выражение пройдет по всей строке, а потом посимвольно будет откатываться назад. Чтобы этого не было, для ускорения, добавляем вопрос, т.е. пишем так [\w\W]*? 3. Прямые слэши в текстовых строчках маскировать нет необходимости. заменяем text\/javascript на text/javascript и <\/script> на </script> 4. Собственно, из-за чего не работало. Обратные слэши маскоровать в текстовых строках надо обязательно, т.е. [\\w\\W] После всех этих исправлений: var htmlJsRe = new RegExp('([\\w\\W]*?)<script type="text/javascript">([\\w\\W]*?)</script>', 'mg'); 5. Вызывает сомнение нужность флагов 'mg', а вот флаг 'i' возможно и нужен, вдруг тэги будут написаны большими буквами. 6. <script type="text/javascript"> возможно стоит заменить на <script[^>]*> (кстати, тут после звездочки вопрос ни к чему :-) ) |
rgl,
Вы сами проверяли свои размышления? |
Что конкретно?
|
rgl,
<!DOCTYPE HTML> <html> <head> <title></title> </head> <body> <script language="JavaScript" type="text/javascript"> var content='<div style="clear: both;"> </div>\ <script type="text/javascript">// <![CDATA[\ jQuery(document).ready(function(){\ \ jQuery("#he5").css("display","none");\ jQuery("#hb5").on("click",function () {\ jQuery("#he5").toggle("slow");\ });\ })\ // ]]><\/script>'; //var htmlJsRe = new RegExp('([\\w\\W]*)<script type="text\/javascript">([\\w\\W]*)<\\/script>', 'mg'); var htmlJsRe = new RegExp('([\\w\\W]*?)<script type="text/javascript">([\\w\\W]*?)</script>', 'mg'); var htmlJsReArray = htmlJsRe.exec(content); alert(htmlJsReArray.join('\n\n\n')); </script> </body> </html> |
Ошибся, в <\/script> маскировка нужна, но это уже не регулярные выражения и не JavaScript, этого требует html, а я тестирую скрипты без html, вот и ошибся. Если поместить мое выражение в отдельный файл и включить с помощью <script src= то все работает.
|
Спасибо всем огромное за примеры и подробный разбор моего регулярного выражения! Проблема решена)
|
Часовой пояс GMT +3, время: 04:11. |