<?php
namespace Jasny\Twig;
/**
* Expose the PCRE functions to Twig.
*
* @see http://php.net/manual/en/book.pcre.php
*/
class PcreExtension extends \Twig_Extension
{
/**
* Class constructor
*/
public function __construct()
{
if (!extension_loaded('pcre')) {
throw new \Exception("The Twig PCRE extension requires the PCRE extension."); // @codeCoverageIgnore
}
}
/**
* Return extension name
*
* @return string
*/
public function getName()
{
return 'jasny/pcre';
}
/**
* {@inheritdoc}
*/
public function getFilters()
{
return [
new \Twig_SimpleFilter('preg_quote', [$this, 'quote']),
new \Twig_SimpleFilter('preg_match', [$this, 'match']),
new \Twig_SimpleFilter('preg_get', [$this, 'get']),
new \Twig_SimpleFilter('preg_get_all', [$this, 'getAll']),
new \Twig_SimpleFilter('preg_grep', [$this, 'grep']),
new \Twig_SimpleFilter('preg_replace', [$this, 'replace']),
new \Twig_SimpleFilter('preg_filter', [$this, 'filter']),
new \Twig_SimpleFilter('preg_split', [$this, 'split']),
];
}
/**
* Check that the regex doesn't use the eval modifier
*
* @param string $pattern
* @throws \LogicException
*/
protected function assertNoEval($pattern)
{
$pos = strrpos($pattern, $pattern[0]);
$modifiers = substr($pattern, $pos + 1);
if (strpos($modifiers, 'e') !== false) {
throw new \Twig_Error_Runtime("Using the eval modifier for regular expressions is not allowed");
}
}
/**
* Quote regular expression characters.
*
* @param string $value
* @param string $delimiter
* @return string
*/
public function quote($value, $delimiter = '/')
{
if (!isset($value)) {
return null;
}
return preg_quote($value, $delimiter);
}
/**
* Perform a regular expression match.
*
* @param string $value
* @param string $pattern
* @return boolean
*/
public function match($value, $pattern)
{
if (!isset($value)) {
return null;
}
return preg_match($pattern, $value);
}
/**
* Perform a regular expression match and return a matched group.
*
* @param string $value
* @param string $pattern
* @return string
*/
public function get($value, $pattern, $group = 0)
{
if (!isset($value)) {
return null;
}
return preg_match($pattern, $value, $matches) && isset($matches[$group]) ? $matches[$group] : null;
}
/**
* Perform a regular expression match and return the group for all matches.
*
* @param string $value
* @param string $pattern
* @return array
*/
public function getAll($value, $pattern, $group = 0)
{
if (!isset($value)) {
return null;
}
return preg_match_all($pattern, $value, $matches, PREG_PATTERN_ORDER) && isset($matches[$group])
? $matches[$group] : [];
}
/**
* Perform a regular expression match and return an array of entries that match the pattern
*
* @param array $values
* @param string $pattern
* @param string $flags Optional 'invert' to return entries that do not match the given pattern.
* @return array
*/
public function grep($values, $pattern, $flags = '')
{
if (!isset($values)) {
return null;
}
if (is_string($flags)) {
$flags = $flags === 'invert' ? PREG_GREP_INVERT : 0;
}
return preg_grep($pattern, $values, $flags);
}
/**
* Perform a regular expression search and replace.
*
* @param string $value
* @param string $pattern
* @param string $replacement
* @param int $limit
* @return string
*/
public function replace($value, $pattern, $replacement = '', $limit = -1)
{
$this->assertNoEval($pattern);
if (!isset($value)) {
return null;
}
return preg_replace($pattern, $replacement, $value, $limit);
}
/**
* Perform a regular expression search and replace, returning only matched subjects.
*
* @param string $value
* @param string $pattern
* @param string $replacement
* @param int $limit
* @return string
*/
public function filter($value, $pattern, $replacement = '', $limit = -1)
{
$this->assertNoEval($pattern);
if (!isset($value)) {
return null;
}
return preg_filter($pattern, $replacement, $value, $limit);
}
/**
* Split text into an array using a regular expression.
*
* @param string $value
* @param string $pattern
* @return array
*/
public function split($value, $pattern)
{
if (!isset($value)) {
return null;
}
return preg_split($pattern, $value);
}
}