PHP捕获分隔符之间的子字符串
这是我正在使用的代码:PHP捕获分隔符之间的子字符串,php,Php,这是我正在使用的代码: $arr = "@media and (min-width: 768px){ .add{color: black;} } " . "@media screen and (min-width: 480px) { body { background-color: " . "lightgreen; } } " . "@media screen and (max-width: 480px) { div { background-color: " . "lightgreen; }
$arr = "@media and (min-width: 768px){ .add{color: black;} } "
. "@media screen and (min-width: 480px) { body { background-color: "
. "lightgreen; } } "
. "@media screen and (max-width: 480px) { div { background-color: "
. "lightgreen; } ul{color: red;} } ";
$keywords = array('@media', '}}');
$parts = preg_split('/(' . implode('|', $keywords) . ')/', $arr
, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($parts);
这是我的输出:
Array (
[0] => ""
[1] => "@media"
[2] => "and (min-width: 768px){ .add{color: black;} }"
[3] => "@media"
[4] => "screen and (min-width: 480px) { body { background-color: lightgreen; } }"
[5] => "@media"
[6] => "screen and (max-width: 480px) { div { background-color: lightgreen; } ul{color: red;} }"
)
但是,我需要这个:
Array (
[0] =>
[1] => "@media and (min-width: 768px){ .add{color: black;} } "
[2] => "@media screen and (min-width: 480px) { body { background-color: lightgreen; } } "
[3] => "@media screen and (max-width: 480px) { div { background-color: lightgreen; } ul{color: red;} } "
)
什么才是正确的方法
编辑:
两个分隔符是必需的,因为数组可能并不总是相同的。因此,如果出现这种情况:
$arr = "@media and (min-width: 768px){ .add{color: black;} }"
. " body{} @media screen and (min-width: 480px) { body "
. "{ background-color: lightgreen; } } @media screen and "
. "(max-width: 480px) { div { background-color: lightgreen; } "
. "ul{color: red;} }";
预期的产出将是:
Array
(
[0] => "@media and (min-width: 768px){ .add{color: black;} } "
[1] => "body{} "
[2] => "@media screen and (min-width: 480px) { body { background-color: lightgreen; } } "
[3] => "@media screen and (max-width: 480px) { div { background-color: lightgreen; } ul{color: red;} } "
)
有趣的问题!我想出了两个答案,第二个更好 回答1:不干净,很静电。 注意:此解决方案几乎只适用于OP给出的示例。有关更好的解决方案,请参阅答案2 我将提出一些更可调整的东西,而不是像
静态的。就目前而言,它是有效的。
()
答案2:代码越多,越灵活。
现在事实上,我已经想出了一些其他的东西,这是一个函数,它可以深入元素的深度,在@media
的情况下,其中的样式是二度的,因此将在二度范围内。下面是函数:()
很简单,它的输出完全相同,但是现在它可以与任何css一起工作。是的,但是有必要用两个delimeter分割,所以第二个是}。如果$arr是不同的,例如在两个@mediaOh之间有body{background color:lightgreen;},那么我不知道这也是一个愿望。在你的*我需要这个*你也没有分开它,我只是为了你想要的结果。我已经更新了我的答案。我现在已经添加了这个未来,虽然我不知道你们想用它来改变什么行为。我已经编辑了这个问题,因为我不能用多个@放在评论数组中。几分钟前,我意识到我并没有在代码的第二个分隔符上分隔它。你知道我如何将其分离以获得我在上面编辑的所需输出吗?@coderxy我已经编辑了我的答案,这次我添加了一个灵活的版本。它将接受任何css并将其转换为您想要的结果。我希望这已经回答了你的问题,如果没有,请提问。如果已解决,请检查是否已解决。
<?php
$arr = "@media and (min-width: 768px){ .add{color: black;} }"
. " body{} @media screen and (min-width: 480px) { body "
. "{ background-color: lightgreen; } } @media screen and "
. "(max-width: 480px) { div { background-color: lightgreen; } "
. "ul{color: red;} }";
$keywords = array("@media","} body");
$parts = preg_split('/((?<='.implode('|',$keywords).')|(?='.implode('|',$keywords).'))/', trim($arr), null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$staticsize = count($parts);
for($i = 0; $i < $staticsize; $i++){
if(!($i&1)){
$next = $i + 1;
if(strpos($parts[$i], '}') !== false){
$parts[$i] = trim(str_replace("}","",$parts[$i]));
}
$parts[$next] = $parts[$i].$parts[$next];
unset($parts[$i]);
}
}
$parts = array_values($parts);
print_r($parts);
?>
Array
(
[0] => @media and (min-width: 768px){ .add{color: black;}
[1] => body{}
[2] => @media screen and (min-width: 480px) { body { background-color: lightgreen; } }
[3] => @media screen and (max-width: 480px) { div { background-color: lightgreen; } ul{color: red;} }
)
function split_depth($string){
$keywords = array("{","}");
$parts = preg_split('/((?<='.implode('|',$keywords).')|(?='.implode('|',$keywords).'))/', trim($string), null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$noname = [];
foreach(array_keys($parts) as $key){
if(empty(trim($parts[$key]))){
unset($parts[$key]);
}
}
$parts = array_values($parts);
foreach(array_keys($parts) as $key){
switch(trim($parts[$key])){
case "{":
if(!array_key_exists($key, $noname)){
$noname[$key] = "open";
}
break;
case "}":
if(!array_key_exists($key, $noname)){
$noname[$key] = "close";
}
break;
}
}
$open = 0;
$close = 1;
$cache = -1;
$numberscache = 0;
$sections = [];
foreach(array_keys($noname) as $keyname){
$name = $noname[$keyname];
if($name == "open"){
$open++;
}else{
if($open != 0){
if($close == $open){
$c = ($cache) + (pow($open,2));
array_push($sections, array("open" => $numberscache,"close" => $keyname));
$cache = $c + 1;
$numberscache = $keyname + 1;
$open = 0;
$close = 0;
}
}else{
echo "Syntax error in your CSS";
}
$close++;
}
}
$parts = array_values($parts);
$names = 0;
$output = [];
foreach($sections as $section){
$name = "part".$names;
$howmuch = ($section["close"] + 1) - $section["open"];
$$name = trim(implode("",array_slice($parts,$section["open"],$howmuch)));
array_push($output,$$name);
$names++;
}
return $output;
}
$arr = "@media and (min-width: 768px){ .add{color: black;} }"
. " body{} @media screen and (min-width: 480px) { body "
. "{ background-color: lightgreen; } } @media screen and "
. "(max-width: 480px) { div { background-color: lightgreen; } "
. "ul{color: red;} }";
print_r(split_depth($arr));