2012-01-29 5 views
0

Я пытаюсь выяснить, если строка содержит CSS код с помощью этого выражения:Недопустимое регулярное выражение в JavaScript

var pattern = new RegExp('\s(?[a-zA-Z-]+)\s[:]{1}\s*(?[a-zA-Z0-9\s.#]+)[;]{1}'); 

Но я получаю сообщение об ошибке «недопустимый регулярное выражение» на строке выше ...

Что в этом плохого?

нашел регулярное выражение здесь: http://www.catswhocode.com/blog/10-regular-expressions-for-efficient-web-development

Это для PHP, но он должен работать в JavaScript тоже, верно?

+4

Я предлагаю избегать этого веб-сайта. Принимая рекомендации по кодированию от кошки, вероятно, плохая идея в целом. – Pointy

+1

Хотя CSS не является ужасно сложным языком, он, вероятно, слишком сложный, чтобы быть надежно обнаруженным с одним регулярным выражением. Я предполагаю, что есть лучшие способы решения этой проблемы. – benekastah

ответ

1

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

var pattern = /\s(?:[a-zA-Z-]+)\s*:\s*(?:[^;\n\r]+);/; 

это соответствует то, что выглядит как CSS, например:

background-color: red; 

Вот the fiddle, чтобы доказать это, хотя я бы рекомендую найти другое решение вашей проблемы. Это очень простое регулярное выражение, и нельзя сказать, что оно надежное.

2

Заменить кавычки с / (косой чертой):

var pattern = /\s([a-zA-Z-]+)\s[:]{1}\s*([a-zA-Z0-9\s.#]+)[;]{1}/; 

Вы также не нужны new RegExp() части либо, поэтому она была удалена; вместо того, чтобы использовать цитату или двойную кавычку для обозначения строки , JavaScript использует косую черту /, чтобы обозначить регулярное выражение, которое не является нормальной строкой.

+1

Вы, похоже, заменили кавычки косой чертой '/' – Arjan

+1

Вам не нужен 'новый RegExp', когда вы используете литерал регулярного выражения. Используйте «новый RegExp (« ... »)' или '/.../' ('...', представляющий любое регулярное выражение, которое вы хотите, конечно. – benekastah

+2

@Arjan. Я был слишком поспешным в написании своего ответа. отредактировал его вскоре после этого. – Bojangles

3

Что такое ? в начале двух блоков [a-zA-z-]? Они выглядят неправильно.

?, к сожалению, несколько перегружен в синтаксисе regexp, он может иметь три разных значения, о которых я знаю, и ни один из них не соответствует тому, что я вижу в вашем примере.

Кроме того, для ваших последовательностей \s требуется обратная косая черта, потому что это строка - они должны выглядеть как \\s. Чтобы избежать экранирования, просто используйте синтаксис /.../ вместо new Regexp("...").

Сказанное, даже если этого недостаточно, regexp все еще производит ошибку в Chrome, возможно связанную с последовательностями {1}.

+2

Почему это не комментарий? – Bojangles

+3

@JamWaffles это был не комментарий, потому что это была первая потенциальная проблема, которую я обнаружил, т. Е. Ответ. – Alnitak

+1

Сайт, с которым было получено регулярное выражение, говорит '<\? [Php] * ([^ \?>] *) \?> 'может использоваться для соответствия php-коду. Я могу только предположить, что регулярное выражение CSS так же плохо. – Esailija

2

?'s messing it up. Я не уверен, для чего они нужны.

/\s[a-zA-Z\-]+\s*:\s*[a-zA-Z0-9\s.#]+;/

работал для меня (насколько компиляции. Я не проверял, чтобы увидеть, если он правильно обнаружил строку CSS).

+2

и вы бы заметили, что если бы я еще не положил это в мой ответ? – Alnitak

+1

Я заметил его примерно в то же время. Я думал, что это ценно что у меня было рабочее регулярное выражение. Если дополнительный ответ неуместен, я был бы рад добавить свое регулярное выражение к вашему. – benekastah

+1

Нет, это нормально - по крайней мере, ваш компилятор, даже если он не обязательно делает то же самое, что и сломанный OP. – Alnitak

Смежные вопросы