2011-12-22 24 views
0

我正在制作一个脚本,它从网页获取多个CSS文件,并使用foreach()include()将它们放在一起。Multiple GetBetween调用

我已经找到了正确的功能:

function GetBetween($content, $start, $end) { 
    $r = explode($start, $content); 

    if(isset($r[1])) { 
     $r = explode($end, $r[1]); 
     return $r[0]; 
    } 

    return ''; 
} 

是否有此功能的替代方案来获得阵列中的全部? 如何使用这个来获得数组中的多个字符串? 例如:

foreach($css = GetBetween($page, '<link rel="stylesheet" href="','"') { 
    include("$css"); 
} 

回答

0

其实从函数返回一个数组,你可以遍历它。例如:

$cssFiles = GetBetween($page, '<link rel="stylesheet" href="','"'); 
foreach ($cssFiles as $cssFile) 
{ 
    include($cssFile); 
} 

但是,您的GetBetween函数到目前为止还没有返回数组。你也正试图在这里解析HTML,你并不需要写一个函数来分析它,而是可以利用现有的HTML解析器的PHP:

/** 
* All stylesheet files within a HTML source 
*/ 
class StyleSheets extends DOMDocument implements IteratorAggregate 
{ 
    public function __construct($source) 
    { 
     parent::__construct(); 
     $this->loadHTML($source); 
    } 
    public function getIterator() 
    { 
     static $array; 
     if (NULL === $array) 
     { 
      $xp = new DOMXPath($this); 
      $expression = '//head/link[@rel="stylesheet"]/@href'; 
      $array = array(); 
      foreach($xp->query($expression) as $node) 
       $array[] = $node->nodeValue; 
     } 
     return new ArrayIterator($array); 
    } 
} 

然后,您可以轻松地使用它:

foreach(new StyleSheets($page) as $index => $file) 
{ 
    printf("#%d: %s\n", $index, $file); 
} 

Demo /输出示例:

#0: file1.css 
#1: file2.css 
#2: file3.css 

从技术上讲,你与你的GetBetween功能做使它回报,你可以做同样的事情用一个字符串搜索一个数组也是如此。但是,因为它是HTML,我建议你使用HTML解析器,以便更安全。

+0

谢谢你很多 – user1079160 2011-12-22 19:27:30

+0

如果它对你有帮助,请接受答案。请参阅http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – hakre 2011-12-22 19:38:47