Как написать регулярное выражение, чтобы шаблоны могли появляться в любом порядке? - PullRequest
2 голосов
/ 01 декабря 2008

У меня есть следующее очень простое совместимое с Javascript регулярное выражение:

<script type="text/javascript" id="(.+)" src="([^"]+)">

Я пытаюсь сопоставить теги сценария и собрать атрибуты ID и src. Я хотел бы сделать порядок атрибутов неактуальным, так что следующее все равно будет соответствовать:

<script id="..." type="text/javascript" src="...">
<script src="..." id="..." type="text/javascript">
<script id="..." src="..." type="text/javascript">

Можно ли разрешить атрибутам появляться в любом порядке, не ставя под угрозу его способность собирать совпадающие ID и src?

edit Строка для сопоставления исходит от innerHTML, что делает невозможным обход DOM. Кроме того, я не могу использовать сторонние библиотеки для этого конкретного приложения.

Ответы [ 5 ]

2 голосов
/ 01 декабря 2008

Отказ от ответственности: будьте осторожны с регулярными выражениями и исходным кодом HTML. Он хрупкий, поэтому его легко сломать или обойти, даже не думая использовать его для проверки пользовательского ввода.

Если вы искренни из исходных данных и знаете, что они соответствуют правилам корректного HTML, вы можете использовать это:

var html = "variable/property holding your html source";
var re_script = /<script\s.+?>/ig;
var re_id     = /id="(.*?)"/i;
var re_src    = /src="(.*?)"/i;

var scriptTag = null;
while (scriptTag = re_script.exec(html))
{
  var matchId  = re_id.exec(scriptTag);
  var matchSrc = re_src.exec(scriptTag);

  if (matchId && matchSrc)
  {
    var scriptId  = matchId[1];
    var scriptSrc = matchSrc[1];
    alert('Found script ID="' + scriptId + '", SRC="' + scriptSrc + '"');
  }
}

По сути, это то, что делает jQuery $("script").each(), просто без jQuery и без DOM.

1 голос
/ 01 декабря 2008

Если вам нужно получить теги сценария файла, Не могли бы вы просто использовать document.getElementsByTagName () , а затем просто проверить (возможно, с помощью регулярных выражений), что необходимые вам атрибуты есть.

Regex не хороший инструмент для создания синтаксических анализаторов (по крайней мере, для таких прощающих синтаксисов, как HTML)

1 голос
/ 01 декабря 2008

Звучит как противное регулярное выражение. IMO, вам лучше использовать xpath для запроса DOM. Или же вы можете использовать библиотеку jquery javascript для выбора необходимых вам элементов.

1 голос
/ 01 декабря 2008

Вы также можете попробовать следующее с jQuery:

$("script").each(function() {
    var src = $(this).attr("src");
    var id = $(this).attr("id");

    alert(id + ": " + src);
});

Это будет работать намного лучше, чем мой скрипт Regex.

0 голосов
/ 01 декабря 2008

Попробуйте следующее:

<script\s*\S*\s*(id="([^"]+)")?\s*\S*\s*(src="([^"]+)")\s*\S*\s*(id="([^"]+)")?[^>]*>

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

В качестве альтернативы вы можете сделать

<script\s*(([^=]*)="([^"]*)")+\s*>

Чтобы получить все атрибуты, а затем выбрать те, которые вы хотите в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...