2009-06-23 2 views
0

У меня есть следующие в пределах XHTML документа:Какое регулярное выражение будет соответствовать этим данным?

<script type="text/javascript" id="JSBALLOONS"> 
    function() { 
     this.init = function() { 
      this.wAPI = new widgetAPI('__BALLOONS__'); 
      this.getRssFeed(); 
     }; 
    } 
</script> 

Я пытаюсь выбрать все между этими двумя тегами сценария. id всегда будет JSBALLOONS, если это поможет. Я знаю, как выбрать это, включая теги скриптов, но я не знаю, как выбрать содержимое, исключая теги скриптов. В результате регулярного выражения должно быть:

function() { 
     this.init = function() { 
      this.wAPI = new widgetAPI('__BALLOONS__'); 
      this.getRssFeed(); 
     }; 
    } 
+1

Здравствуйте, с благодарностью удален модератором!?! FYI, в конце этого сообщения были использованы: Спасибо, Пит. Мне не нравятся модераторы, которые занимаются моими сообщениями, особенно снимая мою любезность. – slypete

ответ

8

(Обновлено пост специально для решения Javascript.)

В JavaScript, ваш код может выглядеть следующим образом:

if (data.match(/<script[^>]+id="JSBALLOONS">([\S\s]*?)<\/script>/)) { 
    inner_script = RegExp.$1; 
} 

Это часть между круглыми скобками ([\S\s]*?) сохраняется при помощи механизма регулярных выражений и доступна для вас после того, как найдена совпадение. В Javascript вы можете использовать RegExp.$1 для ссылки на соответствующую часть внутри тегов скрипта. Если у вас более одной такой группы, окруженной (), вы можете обратиться к ним с RegExp.$2 и т. Д., До RegExp.$9.

Javascript не будет соответствовать символам новой строки по умолчанию, поэтому мы должны использовать ([\S\s]*?), а не (.*?), что может иметь больше смысла. Чтобы быть полным, на других языках это не обязательно, если вы используете модификатор s (/.../s).

(я должен добавить, что регулярные выражения, как правило, очень хрупкими, когда выскабливание содержимого из HTML-страниц, как это. Вы можете быть лучше использовать jQuery рамки для извлечения содержимого.)

+0

Привет, спасибо. Это именно то, что у меня есть, но оно содержит теги скриптов. Можете ли вы объяснить, что вы имеете в виду под $ 1? Я незнакома. Благодаря! – slypete

+0

@slypete, какой язык или инструмент вы используете для выполнения регулярного выражения? – molf

+0

@molf, я использую javascript и jQuery. var javascript = this.data.match (/ ] + id = "JSBALLOONS"> ([\ S \ s] *?) <\/script>/ig); this.javascript = eval ('(' + javascript + ')'); – slypete

2

Что джентльмен означает по $ 1 является «значением первой группы захвата». Когда вы вставляете часть своего регулярного выражения в круглые скобки, он определяет группы захвата. Вы считаете их слева направо. Каждая открывающая скобка запускает новую группу захвата. Они могут быть вложенными.

(Есть способы определения вложенных выражений без определения групп захвата. - Я забыл синтаксис)

В Perl $ 1 магию переменный, содержащая строку, совпавшей с первой группой захвата, $ 2 является строка соответствует вторым и т. д. На других языках может потребоваться вызвать метод в возвращаемом объекте соответствия, чтобы получить группу захвата Nth.

Но вернемся к решению molf. Предположим, что он сказал, чтобы использовать этот шаблон вместо:

/<script[^>]+id="JSBALLOONS">(.*)<\/script>/ 

В этом случае, если у вас есть более чем один элемент сценария, это неправильный шаблон сожрет их все, потому что жадный, пункт стоит объяснять. Этот шаблон будет начинаться с первого открывающего тега, соответствовать его закрывающему тегу, продолжать движение и, наконец, соответствовать последнему. Магия в решении molf - это знак вопроса в (. *?), Который делает его неживым. Он вернет кратчайшую строку, которая соответствует шаблону, и, следовательно, не сожрает лишние элементы скрипта.

+0

Спасибо, очень полезно! – slypete

2

Не пытайтесь использовать регулярные выражения для нерегулярных языков. Правильный способ - использовать парсер XML, соответственно.DOM-:

document.getElementById("JSBALLOONS") 

редактирования: Что касается вашего комментария, у меня нет опыта работы с JavaScript или JQuery, но после некоторых поисков, я думаю, что что-то вдоль этих линий должно работать:

$.ajax({ 
    type: "GET", 
    url: "test.xml", 
    dataType: "xml", 
    success: function(xml) { 
    return $(xml).find("#JSBALLOONS").text(); 
    } 
}); 

Может кто-то более квалифицированный исправить это?

+0

Этот контент не включен в DOM, поэтому я боюсь, что он не сработает. – slypete

+0

Документ удаленно загружается в строку, из которой мне нужно извлечь выбранные объекты. Я знаю, что регулярное выражение не лучшее решение. Пожалуйста, дайте мне знать, если вы знаете о других рабочих решениях. Благодаря! – slypete

+0

Опять же, это не сработает. Я пробовал это. Пожалуйста, см. Мой другой более общий вопрос по причине: http://stackoverflow.com/questions/1034881/what-is-the-best-practice-for-parsing-remote-content-with-jquery Надеюсь, кто-то будет способный ответить на этот вопрос. – slypete

0

Позвольте foo быть строкой, содержащей код. Затем вы можете снять защитные теги через

foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<')) 
Смежные вопросы