Мой RegExp для поиска цветов
Начинаю изучать регулярные выражения. Вот моё извращение на тему "Найти цвет в строке":
re = /(?:#[a-f0-9]{3})|(?:#[a-f0-9]{6})|(?:red)|(?:orange)|(?:aqua)|(?:gray)|(?:navy)|(?:silver)|(?:black)|(?:green)|(?:olive)|(?:teal)|(?:blue)|(?:lime)|(?:purple)|(?:white)|(?:fuchsia)|(?:maroon)|(?:red)|(?:yellow)|(?:rgba?\((?:\d+,?)+\))/i
Все замечания, добавления и идеи пишите в тему P.S. Я понимаю, что это, наверное, не кому не нужно, просто хочу понять, можно ли сделать этот рег как-то проще и лучше |
re = /#[a-f0-9]{3}|#[a-f0-9]{6}|red|aqua|gray|navy|silver|black|green|olive|teal|blue|lime|purple|white|fuchsia|maroon|red|yellow|rgba?\(\s*\d+\s*,\s*\d+\s*,\s*\d+(?:\s*,\s*[\d.]+\s*)?\)/i
alert( re.test( "red" ) ); // true
alert( re.test( "rgb(255, 234, 123)" ) ); // true
alert( re.test( "rgba(255, 234, 123, 0.1)" ) ); // true
// куча пробелов
alert( re.test( "rgba( 255, 234, 123, 0.1 )" ) ); // true
alert( re.test( "#f0fe34" ) ); // true
alert( re.test( "#fe4" ) ); // true
alert( re.test( "а нету цвета" ) ); // false
alert( re.test( "белый" ) ); // false
|
devote,
О, спасибо, думал, что | только на 1 символ действует. |
Раед,
не...прелесть или в рег. выражениях, что "или" работает с человеческой логикой, как в паскале: (a=5) or (a=6), а не так как в js, не напишешь же: a==5 || a==6 || a==7 |
9xakep, не понял вашего примера. Как это вообще связано?))
|
Вот ещё рег для поиска всяких едениц типа 1em 2pt
re=/(?:\s|^)\d+(?:px|em|%|mm|cm|pt|pc|ex)(?=\s|$)/gi Может кто подскажет, как сделать так, чтобы передний пробел в результат не входил |
Цитата:
a = 5 alert(a==5 || a==6 || a==7) |
Будь проще.
re=/\b\d*?(?:px|em|%|mm|cm|pt|pc|ex)\b/gi
str= " 1em ";
alert("'" + str.match(re) + "'");
P. S. Кстати, не уверен, что с точки зрения спецификации указание единиц измерения регистронезависимо. Возможно, флаг i нужно убрать. |
А можешь пояснить, что значит \b и чем отличается от [\s^$]. (Справочник читал, но не понял). И ещё по поводу \d*?. Разве могут быть единицы измерения без цифр? А вот без самих обозначений (ну px и т.п.) могут. Что я не понимаю?
re=/\b\d*?(?:px|em|%|mm|cm|pt|pc|ex)\b/gi
str= " 1 ";
alert("'" + str.match(re) + "'");
str = ' px'
alert("'" + str.match(re) + "'");//странновато как-то
Цитата:
|
Цитата:
|
Цитата:
|
Товарищ, учи регэкспы правильно! (с)
А если по теме: Цитата:
Цитата:
Цитата:
Окончательный вариант(с плюсиком)
re=/\b\d+(?:px|em|%|mm|cm|pt|pc|ex)\b/gi
str= " 1em 1 em 2cm 1 1px 2empx";
alert("'" + str.match(re) + "'");
Цитата:
|
Цитата:
body{margin:0;padding:0}
это уже не правильно? |
Цитата:
re=/\b\d+(?:px|em|%|mm|cm|pt|pc|ex)\b|\b0\b/gi
str= " 1em 1 em 2cm 0 10 1px 2empx";
alert("'" + str.match(re) + "'")
|
Цитата:
В любом случае, если нужно с поддержой такой штуки - то:
re=/\b(?:\d+(?:px|em|%|mm|cm|pt|pc|ex))|0\b/gi
str= " 1em 1 0 0em em 2cm 1 1px 2empx";
alert("'" + str.match(re) + "'");
P. S. devote, опередил) |
Цитата:
http://www.w3.org/TR/css3-values/ |
melky, надоест) А твои варианты?)
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
псевдокод :
var значение = /*2px, 3345PX, 62in, 3%, 5* .. значение, короче/;
if( верное(значение) ){
результат = рега.exec(значение);
}
function верное( значение ){
// проверить посредством HTML (элемент)
}
код : PS затестите, пожалуйста, в виндовых браузерах. у меня под рукой только FF и CH
function parseValue(){
var
dummy = document.createElement('b'),
reg = /(\d+)(%|\w*)/;
parseValue = function(value){
if(parseValue.isNormal(value)){
reg.exec(value);
return { value: RegExp.$1, dimension: RegExp.$2 };
}
};
parseValue.isNormal = function(value){
if(value === "0") {
return true; // "чистый" нуль все вертят, как хотят.
} else {
// IE FIX : он метает ошибку, если значение неверное.
try {
dummy.style.fontSize = value;
} catch(e) {
return false; // если неверное значение, IE породит ошибку (итог: значение неверное)
}
return dummy.style.fontSize === value;
}
};
return parseValue.apply(this, arguments);
}
var a="1px 2in 4% 0 0px 0% 65334em СТОЛpx ы%".split(' ');
var i = 0;
var parsed;
while(i in a){
parsed = parseValue(a[i]);
a[i] = a[i++]+" => "+ (parsed?parsed.value+":"+parsed.dimension:'ничего');
}
alert(a.join('\n'));
|
melky,
Ну в FF вроде нормально работает |
Цитата:
|
Цитата:
|
Цитата:
|
| Часовой пояс GMT +3, время: 10:33. |