ActionScript HTML Regexp Selector - PullRequest
       9

ActionScript HTML Regexp Selector

0 голосов
/ 26 апреля 2011

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

У меня есть фрагмент кода ActionScript, который должен оценивать строку HTMLи разбить его на отдельные части.Таким образом, строка типа <p>Hi</p><span>Hi</span><a href="index.php">Hi</a> будет переведена в:

1. <p>Hi</p>
2. <span>Hi</span>
3. <a href="index.php">Hi</a>
...

Однако, когда я запускаю тестовую версию этого кода, я получаю взамен значение null .Я почти уверен, что моя строка регулярного выражения хороша, но я делаю что-то не так в ActionScript.Не могли бы вы указать в правильном направлении?Мой код ниже:

var evaluatedInput:RegExp = new RegExp('/<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\1>/');
var output:Object = evaluatedInput.exec("<p>Hi</p><span>Hi</span><a href=\"index.php\">Hi</a>");
trace(output);

Спасибо за ваше время,
spryno724

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

В ActionScript вы должны создать объект RegExp одним из двух способов. Вы можете заключить выражение в /.../ разделители для формирования литерала регулярного выражения:

/<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)<\/\1>/gi

... или вы можете записать его в виде строки литерал, который вы передаете в конструктор RegExp:

new RegExp('<([A-Z][A-Z0-9]*)\\b[^>]*>(.*?)</\\1>', 'gi')

Похоже, вы используете объединение двух методов и в результате получаете мусор. Некоторые другие интересные места:

  • Поскольку литералы регулярных выражений используют косую черту в качестве разделителя, любой / в самом регулярном выражении необходимо экранировать обратной косой чертой, например, <\/\1>

  • В строковой версии это обратная косая черта , которую вы должны экранировать (например, </\\1>). В противном случае компилятор AS пытается рассматривать его как часть строковой литеральной escape-последовательности, например \" или \n. В вашем коде \b представляет собой пробел, а не границу слова, а \1, вероятно, рассматривается как синтаксическая ошибка, а не обратная ссылка, как вы предполагали.

  • Вашему регулярному выражению нужны модификаторы g ("global") и i ("ignore-case"); Я продемонстрировал, как их применять.

1 голос
/ 26 апреля 2011

Пример использования

Адаптировано отсюда
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/RegExp.html#exec()

     var myPattern:RegExp = /\>\</g;  
     var str:String = "<p>Hi</p><span>Hi</span><a href=\"index.php\">Hi</a>";
     var result:Object = myPattern.exec(str);

     //To loop through all results manually
     while (result != null) {             
         trace ( result.index, "\t", result);            
         result = myPattern.exec(str);
     }

     //or, just replace. Note this does not required the myPattern.exec(str);
     str.replace(myPattern, ">\n<");

Оригинальный ответ

См.этот ответ:

AS3 RegEx возвращает ноль

По крайней мере, инструмент от gSkinner должен быть решением вашей проблемы.

В частности, чтобы сделать то, что вы хотите сделать, вы бы использовали следующее выражение регулярного выражения:

/\>\</g

И в ваших совпадениях используйте значение индекса и замените его на:

>\n<

Вы можете самостоятельно проверить это на инструменте gskinner Regexr, используя вкладку «Заменить».

...