Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP捕获分隔符之间的子字符串_Php - Fatal编程技术网

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));