регулярное выражение в as3, чтобы игнорировать совпадение с определенным началом строки - PullRequest
3 голосов
/ 24 августа 2010

У меня есть следующая функция as3, которая преобразует обычный html со ссылками, чтобы перед ссылками был добавлен 'event:', чтобы я мог перехватить их с помощью прослушивателя TextEvent.

protected function convertLinks(str:String):String
{
  var p1:RegExp = /href|HREF="(.[^"]*)"/gs;
  str = str.replace(p1,'HREF="event:$1"');
  return str;
}

Например

<a href="http://www.somedomain.com">

преобразуется в

<a href="event:http://www.somedomain.com">

Это прекрасно работает, но у меня проблема со ссылками, которые уже были преобразованы.

Мне нужно исключить ситуацию, когдау меня есть строка, такая как

<a href="event:http://www.somedomain.com"> 

, пропущенная через функцию, потому что в данный момент она преобразуется в

<a href="event:event:http://www.somedomain.com">

, которая разрывает ссылку.

Как можноя изменяю свою функцию так, чтобы ссылки с 'event:' в начале НЕ совпадали и оставались неизменными?

1 Ответ

4 голосов
/ 24 августа 2010

Прежде всего, попытка манипулировать HTML с помощью регулярных выражений может быть не очень хорошей идеей.

При этом, согласно таблице сравнения вкусов на регулярном выражении регулярных выражений .info , регулярное выражение ActionScriptоснован на механизме ECMA, который поддерживает lookaheads .

Таким образом, вы можете написать это:

/(?:href|HREF)="(?!event:)(.[^"]*)"/

(?=…) is Positive Lookahead;он утверждает, что данный шаблон может быть сопоставлен.(?!…) является отрицательным с нетерпением;он утверждает, что данный шаблон может НЕ быть сопоставленным.

Обратите внимание, что включение . очень своеобразно.Вероятно, он не предназначен для включения туда ., поскольку он может соответствовать закрывающей двойной кавычке.

Обратите внимание, что я исправил чередование для href/HREF, используя незахват группа (?:…).

Это потому, что:

  • this|that соответствует либо "this", либо "that"
  • this|that thing соответствует либо "this" или "that thing"
  • (this|that) thing соответствует либо "this thing", либо "that thing"

В качестве альтернативы вы также можете захотетьпросто включите флаг нечувствительности к регистру /i, который будет обрабатывать такие вещи, как hReF или eVeNt:.

Таким образом, возможно, ваш шаблон должен быть просто

/href="(?!event:)([^"]*)"/gsi

Если lookahead не поддерживается, вы можете использовать необязательный шаблон, который соответствует event:, если он есть, исключая его из группы 1, чтобы он не включалсяпри замене в $1.

/href="(?:event:)?([^"]*)"/gsi
       \________/ \_____/
   non-capturing    group 1
     optional
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...