2013-04-03 2 views
1

У меня проблема с куском кода JS. Предполагается найти все вхождения значений цветов CSS (colorNames, #FFFFFF, , RGB, transparent) из данной декларации стиля и заменить их на элемент span, за которым следует сам матч.Соответствие значениям цвета CSS RGB

Ну, все кажется хорошо, за исключением RGB(), которые пропали уже весь мой день.

Небольшая презентация и код можно найти на jsFiddle. И здесь у нас есть предварительный просмотр с моими проблемными элементами.

Спасибо за ваше время и интерес!

+0

Я думаю, что ваш вопрос должен более четко объяснить, что у вас возникли проблемы с использованием регулярного выражения, чтобы найти шаблон типа 'rgb (x, y, z)' – Ian

+0

nope, как вы можете видеть, в этом огромном Regex, у меня есть четыре шаблона для 'rgb()', большинство из них взяты из stackoverflow. – SYNCRo

+1

Да, я вижу это. Но все остальное прекрасно работает. Поэтому ваша проблема связана с конкретными регулярными выражениями RGB. Посмотрите - http://jsfiddle.net/Pm8vV/ - просто используя те специальные регулярные выражения, которые вы нашли, он все равно не работает. – Ian

ответ

1

Следующие должны обрабатывать любые допустимые rgb или rgba значения

var regex = new RegExp(
    "rgb\\((?:(?:\\s*\\d+\\s*,){2}\\s*\\d+|" + 
    "(?:\\s*\\d+(?:\\.\\d+)?%\\s*,){2}\\s*\\d+(?:\\.\\d+)?%)\\s*\\)|" + 
    "rgba\\((?:(?:\\s*\\d+\\s*,){3}|" + 
    "(?:\\s*\\d+(?:\\.\\d+)?%\\s*,){3})\\s*\\d+(?:\\.\\d+)?\\s*\\)", "gi" 
); 

См FIDDLE.

+0

выдающийся! Спасибо. – SYNCRo

0

Функция rgb не поддерживает альфа-аргумент (rgba does). Кроме того, ваши регулярные выражения, соответствующие этим функциям, не работают. Я должен признать, что слишком много боли, чтобы отлаживать все эти регулярные выражения, чтобы соответствовать только одному, поэтому мы постараемся сделать только один. Try (не любая проверка значений):

/(rgb\((?:\s*\d{1,3}\s*%?\s*,?\s*){3}\))/gi 

Result.

Edit:
Если вы хотите проверить свои ценности, мы затруднит немного больше это регулярное выражение.

+0

I действительно не знаю, почему ваше Regex не хочет работать с '.replace()' и работать как очарование на '.match()' ... Я просто использовал '(rgb \\ (. *? \\)) 'и теперь все в порядке. Я действительно не забочусь о проверке значений основных цветов, потому что я использую 'rgb (x, y, z)', извлеченный из DOM документа (если у меня есть неправильное объявление в файле .CSS, это заявление не будет можно найти в элементе DOM .styleSheets). [jsFiddle] (http://jsfiddle.net/YEEnE/10/) – SYNCRo

+1

Он работает ([jsFiddle] (http://jsfiddle.net/YEEnE/11/)), вы просто захотите заменить '\ 'by' \\ ', как вы это делаете. Кроме того, '. *?' Может быть немного рискованным, но я думаю, это не имело бы значения, так как вы принимаете правильный CSS. – Loamhoof