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$/";
|
|
}
|
|
}
|