Вход Регистрация
Файл: contao-3.5.8/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Grammar.php
Строк: 135
<?php

/*
 * This file is part of SwiftMailer.
 * (c) 2004-2009 Chris Corbyn
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

/**
 * Defines the grammar to use for validation, implements the RFC 2822 (and friends) ABNF grammar definitions.
 *
 * @author     Fabien Potencier
 * @author     Chris Corbyn
 */
class Swift_Mime_Grammar
{
    
/**
     * Special characters used in the syntax which need to be escaped.
     *
     * @var string[]
     */
    
private static $_specials = array();

    
/**
     * Tokens defined in RFC 2822 (and some related RFCs).
     *
     * @var string[]
     */
    
private static $_grammar = array();

    
/**
     * Initialize some RFC 2822 (and friends) ABNF grammar definitions.
     */
    
public function __construct()
    {
        
$this->init();
    }

    public function 
__wakeup()
    {
        
$this->init();
    }

    protected function 
init()
    {
        if (
count(self::$_specials) > 0) {
            return;
        }

        
self::$_specials = array(
            
'('')''<''>''['']',
            
':'';''@'',''.''"',
            );

        
/*** Refer to RFC 2822 for ABNF grammar ***/

        // All basic building blocks
        
self::$_grammar['NO-WS-CTL'] = '[x01-x08x0Bx0Cx0E-x19x7F]';
        
self::$_grammar['WSP'] = '[ t]';
        
self::$_grammar['CRLF'] = '(?:rn)';
        
self::$_grammar['FWS'] = '(?:(?:'.self::$_grammar['WSP'].'*'.
                
self::$_grammar['CRLF'].')?'.self::$_grammar['WSP'].')';
        
self::$_grammar['text'] = '[x00-x08x0Bx0Cx0E-x7F]';
        
self::$_grammar['quoted-pair'] = '(?:\\'.self::$_grammar['text'].')';
        
self::$_grammar['ctext'] = '(?:'.self::$_grammar['NO-WS-CTL'].
                
'|[x21-x27x2A-x5Bx5D-x7E])';
        
// Uses recursive PCRE (?1) -- could be a weak point??
        
self::$_grammar['ccontent'] = '(?:'.self::$_grammar['ctext'].'|'.
                
self::$_grammar['quoted-pair'].'|(?1))';
        
self::$_grammar['comment'] = '(((?:'.self::$_grammar['FWS'].'|'.
                
self::$_grammar['ccontent'].')*'.self::$_grammar['FWS'].'?))';
        
self::$_grammar['CFWS'] = '(?:(?:'.self::$_grammar['FWS'].'?'.
                
self::$_grammar['comment'].')*(?:(?:'.self::$_grammar['FWS'].'?'.
                
self::$_grammar['comment'].')|'.self::$_grammar['FWS'].'))';
        
self::$_grammar['qtext'] = '(?:'.self::$_grammar['NO-WS-CTL'].
                
'|[x21x23-x5Bx5D-x7E])';
        
self::$_grammar['qcontent'] = '(?:'.self::$_grammar['qtext'].'|'.
                
self::$_grammar['quoted-pair'].')';
        
self::$_grammar['quoted-string'] = '(?:'.self::$_grammar['CFWS'].'?"'.
                
'('.self::$_grammar['FWS'].'?'.self::$_grammar['qcontent'].')*'.
                
self::$_grammar['FWS'].'?"'.self::$_grammar['CFWS'].'?)';
        
self::$_grammar['atext'] = '[a-zA-Z0-9!#$%&'*+-/=?^_`{}|~]';
        self::
$_grammar['atom'] = '(?:'.self::$_grammar['CFWS'].'?'.
                self::
$_grammar['atext'].'+'.self::$_grammar['CFWS'].'?)';
        self::
$_grammar['dot-atom-text'] = '(?:'.self::$_grammar['atext'].'+'.
                '(.'.self::
$_grammar['atext'].'+)*)';
        self::
$_grammar['dot-atom'] = '(?:'.self::$_grammar['CFWS'].'?'.
                self::
$_grammar['dot-atom-text'].'+'.self::$_grammar['CFWS'].'?)';
        self::
$_grammar['word'] = '(?:'.self::$_grammar['atom'].'|'.
                self::
$_grammar['quoted-string'].')';
        self::
$_grammar['phrase'] = '(?:'.self::$_grammar['word'].'+?)';
        self::
$_grammar['no-fold-quote'] = '(?:"(?:'.self::$_grammar['qtext'].
                '|'.self::
$_grammar['quoted-pair'].')*")';
        self::
$_grammar['dtext'] = '(?:'.self::$_grammar['NO-WS-CTL'].
                '|[x21-x5Ax5E-x7E])';
        self::
$_grammar['no-fold-literal'] = '(?:[(?:'.self::$_grammar['dtext'].
                '|'.self::
$_grammar['quoted-pair'].')*])';

        // Message IDs
        self::
$_grammar['id-left'] = '(?:'.self::$_grammar['dot-atom-text'].'|'.
                self::
$_grammar['no-fold-quote'].')';
        self::
$_grammar['id-right'] = '(?:'.self::$_grammar['dot-atom-text'].'|'.
                self::
$_grammar['no-fold-literal'].')';

        // Addresses, mailboxes and paths
        self::
$_grammar['local-part'] = '(?:'.self::$_grammar['dot-atom'].'|'.
                self::
$_grammar['quoted-string'].')';
        self::
$_grammar['dcontent'] = '(?:'.self::$_grammar['dtext'].'|'.
                self::
$_grammar['quoted-pair'].')';
        self::
$_grammar['domain-literal'] = '(?:'.self::$_grammar['CFWS'].'?[('.
                self::
$_grammar['FWS'].'?'.self::$_grammar['dcontent'].')*?'.
                self::
$_grammar['FWS'].'?]'.self::$_grammar['CFWS'].'?)';
        self::
$_grammar['domain'] = '(?:'.self::$_grammar['dot-atom'].'|'.
                self::
$_grammar['domain-literal'].')';
        self::
$_grammar['addr-spec'] = '(?:'.self::$_grammar['local-part'].'@'.
                self::
$_grammar['domain'].')';
    }

    /**
     * Get the grammar defined for 
$name token.
     *
     * @param string 
$name exactly as written in the RFC
     *
     * @return string
     */
    public function getDefinition(
$name)
    {
        if (array_key_exists(
$name, self::$_grammar)) {
            return self::
$_grammar[$name];
        } else {
            throw new Swift_RfcComplianceException(
                "No such grammar '".
$name."' defined."
                );
        }
    }

    /**
     * Returns the tokens defined in RFC 2822 (and some related RFCs).
     *
     * @return array
     */
    public function getGrammarDefinitions()
    {
        return self::
$_grammar;
    }

    /**
     * Returns the current special characters used in the syntax which need to be escaped.
     *
     * @return array
     */
    public function getSpecials()
    {
        return self::
$_specials;
    }

    /**
     * Escape special characters in a string (convert to quoted-pairs).
     *
     * @param string   
$token
     * @param string[] 
$include additional chars to escape
     * @param string[] 
$exclude chars from escaping
     *
     * @return string
     */
    public function escapeSpecials(
$token$include = array(), $exclude = array())
    {
        foreach (array_merge(array('\'), array_diff(self::
$_specials$exclude), $include) as $char) {
            
$token = str_replace($char, '\'.$char$token);
        }

        return 
$token;
    }
}
Онлайн: 2
Реклама