71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace dokuwiki\Subscriptions;
 | |
| 
 | |
| use Exception;
 | |
| 
 | |
| class SubscriberRegexBuilder
 | |
| {
 | |
| 
 | |
|     /**
 | |
|      * Construct a regular expression for parsing a subscription definition line
 | |
|      *
 | |
|      * @param string|array $user
 | |
|      * @param string|array $style
 | |
|      * @param string|array $data
 | |
|      *
 | |
|      * @return string complete regexp including delimiters
 | |
|      * @throws Exception when no data is passed
 | |
|      * @author Andreas Gohr <andi@splitbrain.org>
 | |
|      *
 | |
|      */
 | |
|     public function buildRegex($user = null, $style = null, $data = null)
 | |
|     {
 | |
|         // always work with arrays
 | |
|         $user = (array)$user;
 | |
|         $style = (array)$style;
 | |
|         $data = (array)$data;
 | |
| 
 | |
|         // clean
 | |
|         $user = array_filter(array_map('trim', $user));
 | |
|         $style = array_filter(array_map('trim', $style));
 | |
|         $data = array_filter(array_map('trim', $data));
 | |
| 
 | |
|         // user names are encoded
 | |
|         $user = array_map('auth_nameencode', $user);
 | |
| 
 | |
|         // quote
 | |
|         $user = array_map('preg_quote_cb', $user);
 | |
|         $style = array_map('preg_quote_cb', $style);
 | |
|         $data = array_map('preg_quote_cb', $data);
 | |
| 
 | |
|         // join
 | |
|         $user = join('|', $user);
 | |
|         $style = join('|', $style);
 | |
|         $data = join('|', $data);
 | |
| 
 | |
|         // any data at all?
 | |
|         if ($user . $style . $data === '') {
 | |
|             throw new Exception('no data passed');
 | |
|         }
 | |
| 
 | |
|         // replace empty values, set which ones are optional
 | |
|         $sopt = '';
 | |
|         $dopt = '';
 | |
|         if ($user === '') {
 | |
|             $user = '\S+';
 | |
|         }
 | |
|         if ($style === '') {
 | |
|             $style = '\S+';
 | |
|             $sopt = '?';
 | |
|         }
 | |
|         if ($data === '') {
 | |
|             $data = '\S+';
 | |
|             $dopt = '?';
 | |
|         }
 | |
| 
 | |
|         // assemble
 | |
|         return "/^($user)(?:\\s+($style))$sopt(?:\\s+($data))$dopt$/";
 | |
|     }
 | |
| }
 |