Index: lang/php/Scraper/library/Diggin/Scraper/Filter.php
===================================================================
--- lang/php/Scraper/library/Diggin/Scraper/Filter.php (revision 17673)
+++ lang/php/Scraper/library/Diggin/Scraper/Filter.php (revision 29139)
@@ -17,24 +17,19 @@
 {  
     /**
-     * run filter
+     * Run filter
      *
      * @param array $values
      * @param array |  $filters
-     * @param unknown_type $filterParams
-     * @return unknown
+     * @param array $filterParams
+     * @return array
+     * @throws Diggin_Scraper_Filter_Exception
      */
     public static function run($values, $filters, $filterParams = null)
     {
-        $argValues = $values;
-        
-        if (!is_array($values)) {
-            $values = array($values);
-        }
-        
         foreach ($filters as $filter) {
             
             $return = array();
 
-            if (preg_match('/^[0-9a-zA-Z]/', $filter)) {
+            if (preg_match('/^[0-9a-zA-Z\0]/', $filter)) {
                 if (function_exists($filter)) {
                     foreach ($values as $value) {
@@ -43,6 +38,11 @@
                 } elseif (!strstr($filter, '_')) {
                     require_once 'Zend/Filter.php';
-                    foreach ($values as $value) {
-                        $return[] = Zend_Filter::get($value, $filter);
+                    try {
+                        foreach ($values as $value) {
+                            $return[] = Zend_Filter::get($value, $filter);
+                        }
+                    } catch (Zend_Exception $e) {
+                        require_once 'Diggin/Scraper/Filter/Exception.php';
+                        throw new Diggin_Scraper_Filter_Exception("Unable to load filter '$filter': {$e->getMessage()}");
                     }
                 } else {
@@ -51,6 +51,6 @@
                         Zend_Loader::loadClass($filter);
                     } catch (Zend_Exception $e) {
-                        require_once 'Diggin/Scraper/Exception.php';
-                        throw new Diggin_Scraper_Exception("Unable to load filter '$filter': {$e->getMessage()}");
+                        require_once 'Diggin/Scraper/Filter/Exception.php';
+                        throw new Diggin_Scraper_Filter_Exception("Unable to load filter '$filter': {$e->getMessage()}");
                     }
                     $filter = new $filter();
@@ -60,13 +60,20 @@
                 }
             } else {
-                require_once 'Diggin/Scraper/Autofilter.php';
                 $prefix = substr($filter, 0, 1);
-                $filter = substr($filter, 1);
+                
                 //have
-                if ($prefix === "*") {
-                   $filterds = new Diggin_Scraper_Autofilter(new ArrayIterator($values), $filter, true);
+                if ($prefix === '*') {
+                    require_once 'Diggin/Scraper/Filter/Iterator.php';
+                    $filter = substr($filter, 1);
+                    $filterds = new Diggin_Scraper_Filter_Iterator(new ArrayIterator($values), $filter, true);
                 //not have
-                } elseif($prefix === "!") {
-                   $filterds = new Diggin_Scraper_Autofilter(new ArrayIterator($values), $filter, false);
+                } elseif ($prefix === '!') {
+                    $filter = substr($filter, 1);
+                    $filterds = new Diggin_Scraper_Filter_Iterator(new ArrayIterator($values), $filter, false);
+                } elseif ($prefix === '/' or $prefix === '#') {
+                    $filterds = new RegexIterator(new ArrayIterator($values), $filter);
+                } else {
+                    require_once 'Diggin/Scraper/Filter/Exception.php';
+                    throw new Diggin_Scraper_Filter_Exception("Unkown prefix '$prefix'");
                 }
                 
@@ -76,9 +83,5 @@
             $values = $return;
         }
-            
-        if (!is_array($argValues)) {
-            $return = (string) array_shift($return);
-        }
-        
+
         return $return;
     }
