1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace Symfony\Component\Console\Input;
13:
14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
25: class StringInput extends ArgvInput
26: {
27: const REGEX_STRING = '([^ ]+?)(?: |(?<!\\\\)"|(?<!\\\\)\'|$)';
28: const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')';
29:
30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
40: public function __construct($input, InputDefinition $definition = null)
41: {
42: parent::__construct(array(), null);
43:
44: $this->setTokens($this->tokenize($input));
45:
46: if (null !== $definition) {
47: $this->bind($definition);
48: }
49: }
50:
51: 52: 53: 54: 55: 56: 57: 58: 59:
60: private function tokenize($input)
61: {
62: $input = preg_replace('/(\r\n|\r|\n|\t)/', ' ', $input);
63:
64: $tokens = array();
65: $length = strlen($input);
66: $cursor = 0;
67: while ($cursor < $length) {
68: if (preg_match('/\s+/A', $input, $match, null, $cursor)) {
69: } elseif (preg_match('/([^="\' ]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, null, $cursor)) {
70: $tokens[] = $match[1].$match[2].stripcslashes(str_replace(array('"\'', '\'"', '\'\'', '""'), '', substr($match[3], 1, strlen($match[3]) - 2)));
71: } elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, null, $cursor)) {
72: $tokens[] = stripcslashes(substr($match[0], 1, strlen($match[0]) - 2));
73: } elseif (preg_match('/'.self::REGEX_STRING.'/A', $input, $match, null, $cursor)) {
74: $tokens[] = stripcslashes($match[1]);
75: } else {
76:
77:
78: throw new \InvalidArgumentException(sprintf('Unable to parse input near "... %s ..."', substr($input, $cursor, 10)));
79:
80: }
81:
82: $cursor += strlen($match[0]);
83: }
84:
85: return $tokens;
86: }
87: }
88: