繁体   English   中英

PHP正则表达式-模式不匹配

[英]PHP regex - pattern does not match

我试图用自定义类替换所有正文和html选择器。 (稍后html内容将显示在自定义容器中,并且可用的CSS不会影响主站点。)

这是我尝试过的:

$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行中,body和html(scnd选择器)没有被替换,以我的理解,它应该与正则表达式匹配?

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


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

多亏了cbuckley,我不得不使用lookahead和lookbehind,现在它可以正常工作了;)我做了一些改进,因此现在可以匹配任何可能性。

工作代码:

$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;
}

随后可以滤除多次出现的同一选择器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM