2016-02-26 35 views
8

Tôi đang cố gắng để thay đổi CSS hợp lệ như thế này:Regex để thêm thiếu selectors không hợp lệ CSS

{color:red}

và làm cho nó có giá trị như thế này:

.missing_selector{color:red}

Ví dụ CSS:

a { 
color:black; 
background-color:blue; 
} 

{color:red} 
<!-- TEST --> 

@media screen and (max-width:620px) { 
/* TEST 2 */ 
a.test {color:blue;} 
p[class="test2"] {color:green;} 
} 

Hiện tại của tôi biểu thức chính quy:

/([^a-z0-9\)\];\-_]*\{)/i

Sống thử:

http://www.phpliveregex.com/p/eMq

+0

Chỉ cần một gợi ý, không phải là câu trả lời, nhưng có lẽ thư viện này sẽ giúp: https://github.com/sabberworm/PHP-CSS-Parser Một giải pháp với regex một mình là khá dễ bị lỗi, tôi giả sử. – Jan

+0

Bạn có thể thử ['/^\h*\K(?={)/m'] (https://regex101.com/r/mC7pI5/1) và thay thế bằng' .missing_selector' –

Trả lời

6

Giải pháp

Bạn cần phải sử dụng này:

/(?<=\A|\})(\s*)\{/m 

Replace with:

.missing-selector { 

Các (?<=\A|\}) đảm bảo rằng chỉ có điều (trừ khoảng trắng) trước khi { là sự bắt đầu của chuỗi hoặc một bế mạc }. (Cảm ơn Casimir et Hippolyte để chỉ ra vấn đề ở đó.)

Here's a regex101 demo.

Tại sao Cố gắng của bạn không thành công

này

/([^a-z0-9\)\];\-_]*\{)/i 

không làm những gì bạn nghĩ.

  • ( bắt đầu một nhóm chụp
  • [^a-z0-9\)\];\-_] đòi hỏi một nhân vật khác hơn a-z, 0-9, ), ], ;, -, hoặc _
  • * zero hoặc nhiều lần
  • \{ đòi hỏi sự {
  • ) kết thúc nhóm chụp

Nhưng nó không có một ^, vì vậy nó không gắn liền với sự khởi đầu của một dòng, cũng không xác nhận bất cứ điều gì đứng trước { (mà phải được chỉ sự bắt đầu của chuỗi , khoảng trắng hoặc }).Kết quả là, nó sẽ phù hợp ở khắp mọi nơi bạn có một loạt các khoảng trống hoặc các ký tự không tự chữ và số khác (trừ )];-_) trong CSS mẫu của bạn:

screenshot of regex101 demo

See this regex101 demo for a fuller explanation and example matches.

+0

Cảm ơn @EdCottrell, điều này thực hiện chính xác những gì tôi cần. Tôi thực sự đánh giá cao sự giải thích là tốt. – user2266497

Các vấn đề liên quan