1<?php
2
3namespace dokuwiki\Subscriptions;
4
5use Exception;
6
7class SubscriberRegexBuilder
8{
9    /**
10     * Construct a regular expression for parsing a subscription definition line
11     *
12     * @param string|array $user
13     * @param string|array $style
14     * @param string|array $data
15     *
16     * @return string complete regexp including delimiters
17     * @throws Exception when no data is passed
18     * @author Andreas Gohr <andi@splitbrain.org>
19     *
20     */
21    public function buildRegex($user = null, $style = null, $data = null)
22    {
23        // always work with arrays
24        $user = (array)$user;
25        $style = (array)$style;
26        $data = (array)$data;
27
28        // clean
29        $user = array_filter(array_map('trim', $user));
30        $style = array_filter(array_map('trim', $style));
31        $data = array_filter(array_map('trim', $data));
32
33        // user names are encoded
34        $user = array_map('auth_nameencode', $user);
35
36        // quote
37        $user = array_map('preg_quote_cb', $user);
38
39        $style = array_map('preg_quote_cb', $style);
40        $data = array_map('preg_quote_cb', $data);
41
42        // join
43        $user = implode('|', $user);
44        $style = implode('|', $style);
45        $data = implode('|', $data);
46
47        // any data at all?
48        if ($user . $style . $data === '') {
49            throw new Exception('no data passed');
50        }
51
52        // replace empty values, set which ones are optional
53        $sopt = '';
54        $dopt = '';
55        if ($user === '') {
56            $user = '\S+';
57        }
58        if ($style === '') {
59            $style = '\S+';
60            $sopt = '?';
61        }
62        if ($data === '') {
63            $data = '\S+';
64            $dopt = '?';
65        }
66
67        // assemble
68        return "/^($user)(?:\\s+($style))$sopt(?:\\s+($data))$dopt$/";
69    }
70}
71