PHP 模式不匹配


PHP 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 行中没有替换正文和 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,我不得不使用前瞻和后视,现在它可以正常工作;)我做了一些改进,所以它现在可以匹配任何可能性。

工作代码:

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

之后可以过滤掉同一选择器的多次出现。