Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Регулярные Выражение (http://www.flasher.ru/forum/showthread.php?t=89862)

Nirth 25.12.2006 19:37

Регулярные Выражение
 
Кто тут крутой шарит?

Я вторые сутки пытаюсь понять как составить регулярное выражение, которое бы искало в тексте [acronim="eXtensible Markup Language"]XML[/acronim] и заменяло бы его на <a href="asfunction...........">XML</a>

Тоесть фактически ищем паттерн

[acronim="(сколько угодно символов, и какие угодно)"](сколько угодно и какие угодно)[/acronim]

Есть идеи?

etc 25.12.2006 19:52

/[acronim="(.*)"](.*)[\/acronim]/i

ммм? Не проверял, правда.

Nirth 25.12.2006 20:18

а что i на конце делает?

etc 25.12.2006 20:24

Игнорирование регистра — модификатор. Я не знаю, не смотрел, может в AS3 модификаторы в другом месте ставятся.

fishbounce 25.12.2006 21:26

еще надо в конце g поставить (/ig будет), чтобы все вхождения искал, а не первое.
вроде так:)

Nirth 25.12.2006 22:16

спасибо, завтра утром проверю =)

Nirth 27.12.2006 20:35

нифига не работает.

возвращает 1 (а в строке 2 акронима).

miramax 27.12.2006 21:30

Можно и регулярными выражениями.
Получится не менее трёх выражений.
В таких случаях я по-прежнему юзаю самые классные и а теперь и чрезвычайно быстрые методы split() и join().
Во-первых быстрее. Регулярные выражения работают в среднем раз в 5 медленнее.
Во-вторых, в регулярных выражениях есть какие-то то ли непонятки, то ли баги.

Вобщем разочаровали меня регулярные выражения в АС3.

Nirth 27.12.2006 23:01

Мирамакс, ты читал мой вопрос=)? как ты split\join ом сумеешь найти тэги с разным наполнением?

miramax 28.12.2006 00:10

Код:

var str:String = "Текст[anchor='xmlLink'] в тексте есть такие места'] text sdfs[/anchor]или такие']['  [anchor='xmlLink'] ещё одна ссылка[/anchor]здесь нет ссылки [anchor='xmlLdfdfink']и ещё какая-то ссылка[/anchor]";
var ar:Array;
var i:int = 1;
var a:Array
ar = str.split("[anchor='")
while(i < ar.length)
{
        a = ar[i].split("']")
        if(a.length>1) a.unshift(a.shift().concat("'>", a.shift()));
        a = a.join("']").split("[/anchor]")
        if(a.length>1) a.unshift(a.shift().concat("</a>", a.shift()));
        ar[i] = a.join("");
        i+=1
}
str = ar.join("<a href='asfunction:")
trace(str)


Nirth 28.12.2006 00:21

Тебе не кажется что заменять все символы ] не нужно =)? вдруг они используются еще для каких либо целей, а нужно заменять, только если они являются частью чего либо.

miramax 28.12.2006 00:26

Цитата:

Сообщение от Nirth
Тебе не кажется что заменять все символы ] не нужно =)? вдруг они используются еще для каких либо целей, а нужно заменять, только если они являются частью чего либо.

Нет, здесь заменяется то что нужно. :)

etc 28.12.2006 01:35

Nirth, я завтра поковыряюсь с регуляркой, напишу тогда. То, что я написал ранее было написано из головы и не проверялось.

fishbounce 28.12.2006 01:49

Цитата:

Сообщение от Nirth
нифига не работает.

возвращает 1 (а в строке 2 акронима).

А ты /g ставил в конце? вроде работает все...

Bright 29.12.2006 07:31

не знаю на счет АС3, но хороший мануал по регулярным выражениям есть на пхпклубе.
если не читал (сомневаюсь :) ) посмотри.

Цитата:

Сообщение от Nirth
нифига не работает.

возвращает 1 (а в строке 2 акронима).

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

Nirth 29.12.2006 08:52

я ставил g и i и еще какой то указатесь, пользвался RegExp.exec(), и string.search() =) да я тупой в регулярных, я не скрываю, уже больше года (с альфа флекса) пытаюсь понять че в них =)

Dendroid 29.12.2006 10:50

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

Код:

var line = '[acronim="eXtensible Markup Language"]XML[/acronim] text text text text text text \ntext [acronim="eXtensible Markup Language Again"]another XML[/acronim]';
var reg = /\[acronim=("[^"]*")\]([^\[]*)\[\/acronim\]/g;
var result = line.replace(reg,"<a href=asfunction:$1>$2</a>");
trace(result);

(не обрабатывает вхождения кавычек и квадратных скобок внутри искомых строк - их лучше "выкусывать" отдельным регулярным выражением)

У меня два вхождения числа 666 под аватарой! :eek:

etc 29.12.2006 11:02

Цитата:

Сообщение от Dendroid
У меня два вхождения числа 666 под аватарой! :eek:

Одно неверно определилось :))

Nirth, сорри, НГ на носу, какой флеш… :D

miramax 29.12.2006 15:07

Цитата:

Сообщение от Dendroid
(не обрабатывает вхождения кавычек и квадратных скобок внутри искомых строк - их лучше "выкусывать" отдельным регулярным выражением)

Если такое разрешить, то сплит-джоинтами ещё проще будет и быстрее :
Код:

var line:String = '[acronim="eXtensible Markup Language"]XML[/acronim] text text text text text text \ntext [acronim="eXtensible Markup Language Again"]another XML[/acronim]';
var result:String = line.split('[acronim="').join('<a href="').split('"]').join(">").split('[/acronim]').join('</a>')
trace(result);;

Юзать String.replace() - будет лаконичнее, но этот метод слишком медленный, если надо обработать несколько тысяч символов.
Но есть множество задач, где без регулярных выражений туго :)
Цитата:

У меня два вхождения числа 666 под аватарой!
Срочно отпишись в этом топике ! :)

sts 03.01.2007 21:11

Цитата:

Сообщение от miramax
Во-первых быстрее. Регулярные выражения работают в среднем раз в 5 медленнее.


Вобщем разочаровали меня регулярные выражения в АС3.

просто их 2 вида + POSIX
DFS оч. быстрые, NFS - смотря как использовать но медленней
как они реализованы в АС я не знаю то НФС cкорее всего (DFS обычно в текстовиках)


Часовой пояс GMT +4, время: 08:50.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.