我写了这个RegEx专栏:
$dp = preg_replace('/(.*'.$definition.'.*?\s'.$property.':)([^;]*)(.*)/is','$2',$css);
应该推断CSS定义属性的值。 换句话说,如果我的CSS是:
#mydiv {
width: 100px;
}
$ dp应该使用$ definition ='#mydiv'和$ property ='width'返回'100px';
代码似乎有用(但如果你看错了,请告诉我),除了它还匹配'mydiv'或'.mydiv'这一事实。你可以帮我修改一下代码,这样如果我只有$ definition ='#mydiv'匹配#mydiv而不是'mydiv'或'.mydiv'?
我在想,因为所有$定义都在新行的开头,我可以尝试更改它,以便它从行的开头匹配所有$ definition但我不知道如何执行此操作我不知道这是不是最好的方式。 我愿意接受建议。
该代码应该适用于所有不同类型的CSS定义和属性。
感谢您的帮助!
答案 0 :(得分:0)
你可以试试这个正则表达式:
^#mydiv\s*{.*?width\s*:\s*([^;]+);.*?}
答案 1 :(得分:0)
我仍然有'mydiv'匹配'.mydiv'和'#mydiv'的问题所以今天早上我想出了这个似乎有效的解决方案...我相信它不是最正确的但是它似乎工作,所以我想知道你是否可以审查它,让我知道你的想法:
function tbs_css_find($definition,$property) {
global $css;
$definition_encoded = PostFriendlyCSS_encode($definition);
echo $definition;
if ( substr($definition, 0, 1) == '.' ) {
$css = str_replace($definition,$definition_encoded,$css);
$definition_property_value = preg_replace('/(.*'.$definition_encoded.'.*?\s'.$property.':)([^;]*)(.*)/is','$2',$css);
} else if ( substr($definition, 0, 1) == '#' ) {
$css = str_replace($definition,$definition_encoded,$css);
$definition_property_value = preg_replace('/(.*'.$definition_encoded.'.*?\s'.$property.':)([^;]*)(.*)/is','$2',$css);
} else if ( preg_match('/^\b'.$definition_encoded.'\b/im',$css) ) {
$definition_property_value = preg_replace('/(.*^\b'.$definition_encoded.'\b.*?\s'.$property.':)([^;]*)(.*)/ism','$2',$css);
} else {
$definition_property_value = preg_replace('/(.*'.$definition.'.*?\s'.$property.':)([^;]*)(.*)/is','$2',$css);
}
return trim($definition_property_value);
}
function PostFriendlyCSS_encode($definition) {
$definition = str_replace('#','%%%pound%%%',$definition);
$definition = str_replace('.','%%%dot%%%',$definition);
$definition = str_replace(',','%%%comma%%%',$definition);
$definition = str_replace(':','%%%semicolon%%%',$definition);
$definition = str_replace('=','%%%equal%%%',$definition);
$definition = str_replace('"','%%%quote%%%',$definition);
$definition = str_replace('[','%%%lbracket%%%',$definition);
$definition = str_replace(']','%%%rbracket%%%',$definition);
$definition = str_replace(' ','%%%space%%%',$definition);
return $definition;
}
为了确保我只匹配'mydiv'而不是'.mydiv'和'#mydiv',我将\ b word-boundry添加到preg_replace和多行'm'修饰符并且我匹配了在新行的开头定义。
我假设每个新的CSS定义都在新行的开头,因为它出现在我见过的每个或大多数CSS文件中......所以我想如果有一个CSS定义不是一行的开头,但在这一点上我想不出更好的解决方案......
当然我愿意接受建议......