/** * @param TokenCollection $parameters * @return TokenString * @throws \Exception */ public function call(TokenCollection $parameters) { $numParams = $parameters->count(); $isRegExpr = \false; if ($numParams < 1) { $search = ''; } else { $search = $parameters->current()->getValue(); $isRegExpr = $parameters->current() instanceof TokenRegex; } if ($numParams < 2) { $replace = 'undefined'; } else { $parameters->next(); $replace = $parameters->current()->getValue(); } if ($isRegExpr) { list($expression, $modifiers) = $this->splitRegex($search); $modifiers = str_replace('g', '', $modifiers, $count); $limit = $count > 0 ? -1 : 1; $value = preg_replace($expression . $modifiers, $replace, $this->token->getValue(), $limit); } else { $value = str_replace($search, $replace, $this->token->getValue()); } return new TokenString($value, $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return TokenString */ public function call(TokenCollection $parameters) { $params = []; if ($parameters->count() < 1) { $params[] = 0; } else { $params[] = (int) $parameters->current()->getValue(); } if ($parameters->count() >= 2) { $parameters->next(); $params[] = (int) $parameters->current()->getValue(); } $value = call_user_func_array('substr', array_merge([$this->token->getValue()], $params)); return new TokenString((string) $value, $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return Tokens\TokenArray */ public function call(TokenCollection $parameters) { $separator = $parameters->current(); if (!$separator || !is_string($separator->getValue())) { $newValue = [$this->token->getValue()]; } else { $params = [$separator->getValue(), $this->token->getValue()]; if ($parameters->count() >= 2) { $parameters->next(); $params[] = (int) $parameters->current()->getValue(); } if ($separator instanceof Tokens\TokenRegex) { $func = 'preg_split'; } else { $func = 'explode'; } $newValue = call_user_func_array($func, $params); } return new Tokens\TokenArray($newValue, $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return TokenInteger * @throws \Exception */ public function call(TokenCollection $parameters) { if ($parameters->count() < 1) { $value = -1; } else { $value = strpos($this->token->getValue(), $parameters->current()->getValue()); if ($value === \false) { $value = -1; } } return new TokenInteger($value, $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return TokenString */ public function call(TokenCollection $parameters) { if ($parameters->count() < 1) { $offset = 0; } else { $offset = (int) $parameters->current()->getValue(); } $tokenValue = $this->token->getValue(); if (!isset($tokenValue[$offset])) { $char = ''; } else { $char = $tokenValue[$offset]; } return new TokenString($char, $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return Tokens\TokenString * @throws ParserException */ public function call(TokenCollection $parameters) { if (!$this->token instanceof Tokens\TokenArray) { throw new ParserException(sprintf('%s.join is not a function at position %d on line %d', $this->token->getValue(), $this->token->getPosition(), $this->token->getLine())); } if ($firstParam = $parameters->current()) { $glue = $firstParam->getValue(); } else { $glue = ','; } $array = $this->token->getValue(); if ($array instanceof TokenCollection) { $array = $array->toArray(); } return new Tokens\TokenString(implode($glue, $array), $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return TokenBool * @throws ParserException */ public function call(TokenCollection $parameters) { if (!$this->token instanceof TokenRegex) { throw new ParserException(sprintf('undefined is not a function at position %d on line %d', $this->token->getPosition(), $this->token->getLine())); } if ($parameters->count() < 1) { $bool = \false; } else { // Remove "g" modifier as is does not exist in PHP // It's also irrelevant in .test() but allowed in JS here $pattern = preg_replace_callback('~/[igm]{0,3}$~', function (array $modifiers) { return str_replace('g', '', $modifiers[0]); }, $this->token->getValue()); $subject = $parameters->current()->getValue(); while ($subject instanceof TokenCollection) { $subject = current($subject->toArray()); } $bool = (bool) preg_match($pattern, (string) $subject); } return new TokenBool($bool, $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return TokenFloat */ public function call(TokenCollection $parameters) { $parameters->rewind(); return new TokenFloat((double) $parameters->current()->getValue(), $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return TokenInteger */ public function call(TokenCollection $parameters) { return new TokenInteger((int) $parameters->current()->getValue(), $this->token->getOffset(), $this->token->getStack()); }