2013-10-16 5 views
0

모든 body 및 html 선택기를 사용자 정의 클래스로 바꾸려고합니다. (. 나중에 HTML 콘텐츠에이 사용자 지정 컨테이너에 표시됩니다 및 사용 가능한 CSS를 메인 사이트에 영향을주지해야한다) 여기 PHP 정규식 - 패턴이 일치하지 않습니다.

이있는 나는 시도했다 :

$data = "html body { color: red; }\nbody html { color: red; }\nhtml, body { color: red; }\nbody, html, .body table, #html-TemplateContainer {\nbackground-color:#eee;\n}"; 
echo "<pre>".preg_replace('/(^|[,}\s]+)(body html|html body|html|body)([,.{\s]*)/is', '$1'.'.foo'.'$3', $data)."</pre>"; 

인쇄 어느 :

.foo { color: red; } 
.foo { color: red; } 
.foo, body { color: red; } 
.foo, html, .body table, #html-TemplateContainer { 
background-color:#eee; 
} 

3 행과 4 행에서 본문과 html (scnd selector)이 대체되지 않는 이유를 이해하지 못합니다. 내 이해를 위해 정규식과 일치해야합니까?!

+1

** HTML 및 CSS를 처리하기 위해 정규 표현식을 사용하지 마시고 대신 HTML 파서를 사용하십시오. –

+1

일치 항목은 대체물에서 겹칠 수 없으므로 3 행에서 'html'(끝 부분 포함)과 일치하고 'body'와 일치 할 수 없습니다. – cmbuckley

+0

내 요구 사항에 맞는 html 파서를 제안 할 수 있습니까? 쉽게 처리하기 위해 이미 csstidy를 사용하지만 선택기를 다른 것으로 간단히 바꿀 수는 없습니다. 나 또한 사바 웜을 시도했지만 네임 스페이스로 인해 깨울 수는 없었다. ( @cbuckley 아 .. 덕분에 내가 알게 됐어 .. 선견자가 되려구? 알았어. .. – Hasenpriester

답변

0

덕분에 내가 내다 및 lookbehind를 사용했고 지금은 잘 작동 cbuckley합니다) 지금 어떤 가능성을 일치 할 수 있도록 좀 개선을했다.

작업 번호 :

$data = "html body { color: red; }\nhtml *.class { color: red; }\nhtml,body { color: red; }\nhtml[dir=\"rtl\"], body, .body table, #html-container\n{\n background-color:#eee;\n}"; 
echo "<pre>".preg_replace('/(?<=^|[,}\]\s])(\*\s+html\s+body|\*\s+body\s+html|html\s+\*\s+body|html\s+body\s+\*|body\s+\*\s+html|body\s+html\s+\*|\*\s+html|\*\s+body|html\s+\*|html\s+body|body\s+\*|body\s+html|\*|html|body)(?=[,.{\[\s]|$)/is', '.foo', $data)."</pre>"; 

원래 CSS :

html body { color: red; } 
html *.class { color: red; } 
html,body { color: red; } 
html[dir="rtl"], body, .body table, #html-container 
{ 
    background-color:#eee; 
} 

변성 CSS : 동일한 선택기

.foo { color: red; } 
.foo.class { color: red; } 
.foo,.foo { color: red; } 
.foo[dir="rtl"], .foo, .body table, #html-container 
{ 
    background-color:#eee; 
} 

다수 발생 후에 여과 할 수있다.

0
You should try this... 
=========================> 


    echo "<pre>".preg_replace('/(^|#|.|\s]+)(body html|html body|html|body)([^,.{\s]*)/is', 
    '$1'.'.foo'.'$3', $data)."</pre>"; 
관련 문제