Regex as3, если часть подстроки имеет значение true, тогда замените часть подстроки на работающую переменную - PullRequest
0 голосов
/ 09 марта 2011

Хорошо, возможно, я слишком откусил здесь ... Я знаю, что вы не должны анализировать xml / html для регулярных выражений, но дело в том, что других вариантов просто нет. Я использую AS3 Я анализирую источник текста textflowlayout в другом формате.

строка для разбора:

< fontFamily=Verdana encoding=unicode fontWeight="bold"> some text < fontFamily=Verdana encoding=unicode > some text < fontFamily=Arial encoding=unicode fontStyle="italic"> some text < fontFamily=Arial encoding=unicode fontWeight="bold" fontStyle="italic"> some text 

что мне действительно нужно:

< fontname=Verdanabold encoding=unicode> some text < fontname=Verdana encoding=unicode > some text < fontname=Arialitalic encoding=unicode > some text < fontname=Arialbolditalic encoding=unicode > some text

логически я думаю об этом, как о разбивке строки на подстроки проверка наличия fontWeight или fontStyle в подстроке если затем добавляется имя шрифта с весом или стилем, так что имя шрифта становится шрифтом NameWeightStyle. затем восстановить строку. Шрифт может быть любым шрифтом с различными стилями или весом.

Или, пожалуйста, оцените любые другие яркие способы сделать это.

пока:

pattern =   /<(.*?)>/gixsm;
var matches:Object = pattern.exec(str);
var finalstring:String = "";
for each ( var i:String in matches ) {

    if(i!='0'){
        Alert.show(i);
    pattern = /fontFamily=\"([^"]*)"/i;
    if(pattern.test(i)==true){
        pattern = /fontFamily=\"([^"]*)\" /i;
        var resultfontFamily:Object = pattern.exec(i);
        var fontFamily:String = resultfontFamily[1].toString();



        /*pattern = /fontWeight=\".*?\" /i;
        if(pattern.test(i)==true){

            pattern = /fontWeight=\"([^"]*)\" /i;
            var resultfontWeight:Object = pattern.exec(i);
            var fontWeight:String  = resultfontWeight[1].toString();
            fontFamily = fontFamily+fontWeight;

        }
        pattern = /fontStyle=\"([^"]*)\" /i;
        if(pattern.test(i)==true){

            pattern = /fontStyle=\"([^"]*)\" /i;
            var resultfontStyle:Object = pattern.exec(i);
            var fontStyle:String  = resultfontStyle[1].toString();
            fontFamily = fontFamily+fontStyle;

        }*/
        fontFamily = "fontname="+fontFamily+" encoding=unicode";
        pattern = /fontFamily=\".*?"/i;
        finalstring += i.replace(pattern, fontFamily);

    }
    }

}
str = finalstring;

несколько вещей 1 - шаблон для создания совпадающего объекта /<(.*?)>/gim; или / <([^ <]) +?> / gim; похоже, не работает в as3 как точный сборщик строк для массива / объекта для этой строки ???

2 при условии, что мы должны собрать этот укус обратно - как бы я получил доступ к «некоторому тексту»?

любые предложения приветствуются - очень признателен M

1 Ответ

0 голосов
/ 09 марта 2011

Ваш вопрос немного двусмысленный - то есть вы не четко указываете, могут ли оба стиля и веса отображаться в одном теге. Кроме того, вы не указываете требования к пробелам и значениям атрибутов. Тем не менее, следующий (синтаксис javascript) код должен справиться практически с любым случаем:

p1 = /(<\s*fontname\s*=\s*)(['"]?)([^\s'"]+)(['"]?)([^>]*?)\s+fontWeight\s*=\s*['"]?([^\s'"]*)['"]?/ig;
p2 = /(<\s*fontname\s*=\s*)(['"]?)([^\s'"]+)(['"]?)([^>]*?)\s+fontStyle\s*=\s*['"]?([^\s'"]*)['"]?/ig;
str = str.replace(p1, "$1$2$3$6$4$5");
str = str.replace(p2, "$1$2$3$6$4$5");

Надеюсь, это поможет! :)

...