Заменить символы с помощью preg_replace()

С помощью preg_match() Я хотел бы сопоставить следующее вхождение в строку:

token=[and here 32 characters a-z0-9]

Например:

token=e940b20a98d01d08d21a919ecd025d90

я пытался

/^(token\=)[a-z0-9]{32}$/

но это не сработало!

То, что я пытаюсь сделать, это:

$referer = $_SERVER['HTTP_REFERER'];
$referer = preg_replace("/^(token=)[a-z0-9]{32}$/","token=".token(),$referer);

Спасибо за любую помощь!

2 ответа

Решение

Я думаю, что URL не обязательно начинается с token и заканчивается его значением. Вы, вероятно, запутались ^ а также $ с границами слова (\b). Кроме того, нет необходимости в группе захвата и не нужно бежать =,

/\btoken=[a-z0-9]{32}\b/

Я бы не стал анализировать реферер с помощью регулярных выражений, когда в PHP уже есть встроенные функции для этой цели: parse_url() а также parse_str(),

К сожалению, нет встроенной функции для создания URL из составных частей, поэтому пользователям приходится придумывать свои собственные (см. Определение Url класс в конце).


Изменение token параметр запроса:

// parse the referer
$components = Url::parse($_SERVER['HTTP_REFERER']);

// replace the token
$components['query']['token'] = token();

// rebuild the referer
$referer = Url::build($components);

Вот упрощенное определение моего Url учебный класс:

/**
 * Url parsing and generating utility
 * 
 * @license https://opensource.org/licenses/MIT MIT License
 * @author ShiraNai7               
 */   
final class Url
{
    /**
     * @param string $url
     * @return array
     */              
    static function parse($url)
    {
        $components = parse_url($url);
        if (false === $components) {
            throw new \InvalidArgumentException('Invalid URL');
        }

        if (isset($components['query'])) {
            parse_str($components['query'], $components['query']);
        }

        return $components + array(
            'scheme' => null,
            'host' => null,
            'port' => null,
            'user' => null,
            'pass' => null,
            'path' => null,
            'query' => array(),
            'fragment' => null,
        );
    }

    /**
     * @param array $components
     * @param bool  $absolute     
     * @return string     
     */         
    static function build(array $components, $absolute = true)
    {
        $output = '';

        if ($absolute) {
            if (empty($components['host']) || empty($components['scheme'])) {
                throw new \LogicException('Cannot generate absolute URL without host and scheme being set');
            }

            if (!empty($components['scheme'])) {
                $output .= $components['scheme'] . '://';
            }

            if (!empty($components['user'])) {
                $output .= $components['user'];
            }
            if (!empty($components['pass'])) {
                $output .= ':' . $components['pass'];
            }
            if (!empty($components['user']) || !empty($components['pass'])) {
                $output .= '@';
            }

            $output .= $components['host'];

            if (!empty($components['port'])) {
                $output .= ':' . $components['port'];
            }
        }

        if (!empty($components['path'])) {
            $output .= (($components['path'][0] !== '/') ? '/' : '') . $components['path'];
        } else {
            $output .= '/';
        }

        if (!empty($components['query'])) {
            $output .= '?';
            $output .= http_build_query($components['query'], '', '&');
        }

        if (!empty($components['fragment'])) {
            $output .= '#' . $components['fragment'];
        }

        return $output;    
    }
}
Другие вопросы по тегам