<?php 
 
/** 
 * Verbal Expressions v0.1 (https://github.com/jehna/VerbalExpressions) ported in PHP 
 * @author Mihai Ionut Vilcu ([email protected]) 
 * 22.July.2013 
 */ 
// // some tests 
// $regex = new VerEx; 
// $regex   ->startOfLine() 
//      ->then( "http" ) 
//      ->maybe( "s" ) 
//      ->then( "://" ) 
//      ->maybe( "www." ) 
//      ->anythingBut( " " ) 
//      ->endOfLine(); 
// if($regex->test("http://github.com")) 
//  echo "valid url"; 
// else 
//  echo "invalid url"; 
// if (preg_match($regex, 'http://github.com')) { 
//  echo 'valid url'; 
// } else { 
//  echo 'invalud url'; 
// } 
// echo "<pre>". $regex->getRegex() ."</pre>"; 
// echo $regex ->clean(array("modifiers"=> "m","replaceLimit"=>4)) 
//          ->find(' ') 
//          ->replace("This is a small test http://somesite.com and some more text.", "-"); 
 
 
class VerEx { 
 
    var $prefixes = ""; 
    var $source = ""; 
    var $suffixes = ""; 
    var $modifiers = "m"; // default to global multiline matching 
    var $replaceLimit = 1; // the limit of preg_replace when g modifier is not set 
 
    /** 
     * Sanitation function for adding anything safely to the expression 
     * @param  string $value the to be added 
     * @return string        escaped value 
     */ 
    function sanitize ( $value ) { 
        if ( !$value ) 
            return $value; 
        return preg_quote ( $value, "/" ); 
    } 
 
    /** 
     * Add stuff to the expression 
     * @param string $value the stuff to be added 
     */ 
    function add ( $value ) { 
        $this->source .= $value; 
        return $this; 
    } 
 
    /** 
     * Mark the expression to start at the beginning of the line. 
     * @param  boolean $enable Enables or disables the line starting. Default value: true 
     */ 
    function startOfLine ( $enable = true ) { 
        $this->prefixes = $enable ? "^" : ""; 
        return $this; 
    } 
 
    /** 
     * Mark the expression to end at the last character of the line. 
     * @param  boolean $enable Enables or disables the line ending. Default value: true 
     */ 
    function endOfLine ( $enable = true ) { 
        $this->suffixes = $enable ? "$" : ""; 
        return $this; 
    } 
 
    /** 
     * Add a string to the expression 
     * @param  string $value The string to be looked for 
     */ 
    function then ( $value ) { 
        $this->add ( "(" . $this->sanitize ( $value ) . ")" ); 
        return $this; 
    } 
 
    /** 
     * alias for then() 
     * @param  string $value The string to be looked for 
     */ 
    function find ( $value ) { 
        return $this->then ( $value ); 
    } 
 
    /** 
     *  Add a string to the expression that might appear once (or not). 
     * @param  string $value The string to be looked for 
     */ 
    function maybe ( $value ) { 
        $this->add ( "(" . $this->sanitize ( $value ) . ")?" ); 
        return $this; 
    } 
 
    /** 
     * Accept any string 
     */ 
    function anything () { 
        $this->add ( "(.*)" ); 
        return $this; 
    } 
 
    /** 
     * Anything but this chars 
     * @param  string $value The unaccepted chars 
     */ 
    function anythingBut ( $value ) { 
        $this->add ( "([^" . $this->sanitize ( $value ) . "]*)" ); 
        return $this; 
    } 
 
    /** 
     * Accept any non-empty string 
     */ 
    function something () { 
        $this->add ( "(.+)" ); 
        return $this; 
    } 
 
    /** 
     * Anything non-empty except for these chars 
     * @param  string $value The unaccepted chars 
     */ 
    function somethingBut ( $value ) { 
        $this->add ( "([^" . $this->sanitize ( $value ) . "]+)" ); 
        return $this; 
    } 
 
    /** 
     * Shorthand for preg_replace() 
     * @param  string $source the string that will be affected(subject) 
     * @param  string $value  the replacement 
     */ 
    function replace ( $source, $value ) { 
        // php doesn't have g modifier so we remove it if it's there and we remove limit param 
        if ( strpos ( $this->modifiers, 'g' ) !== false ) { 
            $this->modifiers = str_replace ( 'g', '', $this->modifiers ); 
            return preg_replace ( $this->getRegex (), $value, $source ); 
        } 
        return preg_replace ( $this->getRegex (), $value, $source, $this->replaceLimit ); 
    } 
 
    /** 
     * Match line break 
     */ 
    function lineBreak () { 
        $this->add ( "(\\n|(\\r\\n))" ); 
        return $this; 
    } 
 
    /** 
     * Shorthand for lineBreak 
     */ 
    function br () { 
        return $this->lineBreak (); 
    } 
 
    /** 
     * Match tabs. 
     */ 
    function tab () { 
        $this->add ( "\\t" ); 
        return $this; 
    } 
 
    /** 
     * Match any alfanumeric 
     */ 
    function word () { 
        $this->add ( "\\w+" ); 
        return $this; 
    } 
 
    /** 
     * Any of the listed chars 
     * @param  string $value The chars looked for 
     */ 
    function anyOf ( $value ) { 
        $this->add ( "[" . $value . "]" ); 
        return $this; 
    } 
 
    /** 
     * Shorthand for anyOf 
     * @param  string $value The chars looked for 
     */ 
    function any ( $value ) { 
        return $this->anyOf ( $value ); 
    } 
 
    /** 
     * Adds a range to our expresion ex: range(a,z) => a-z, range(a,z,0,9) => a-z0-9 
     */ 
    function range () { 
 
        $arg_num = func_num_args (); 
        if ( $arg_num % 2 != 0 ) { 
            throw new Exception ( "Number of args must be even", 1 ); 
        } 
 
        $value = "["; 
        $arg_list = func_get_args (); 
        for ( $i = 0; $i < $arg_num; ) { 
            $value .= $this->sanitize ( $arg_list[$i++] ) . " - " . $this->sanitize ( $arg_list[$i++] ); 
        } 
        $value .= "]"; 
 
        $this->add ( $value ); 
 
        return $this; 
    } 
 
    /** 
     * Adds a modifier 
     */ 
    function addModifier ( $modifier ) { 
        if ( strpos ( $this->modifiers, $modifier ) === false ) { 
            $this->modifiers .= $modifier; 
        } 
        return $this; 
    } 
 
    /** 
     * Removes a modifier 
     */ 
    function removeModifier ( $modifier ) { 
 
        $this->modifiers = str_replace ( $modifier, '', $modifier ); 
 
        return $this; 
    } 
 
    /** 
     * Match case insensitive or sensitive based on $enable value 
     * @param  boolean $enable Enables or disables case sensitive. Default true 
     */ 
    function withAnyCase ( $enable = true ) { 
        if ( $enable ) { 
            $this->addModifier ( 'i' ); 
        } 
        else { 
            $this->removeModifier ( 'i' ); 
        } 
        return $this; 
    } 
 
    /** 
     * Toggles g modifier 
     * @param  boolean $enable Enables or disables g modifier. Default true 
     */ 
    function stopAtFirst ( $enable = true ) { 
        if ( $enable ) { 
            $this->addModifier ( 'g' ); 
        } 
        else { 
            $this->removeModifier ( 'g' ); 
        } 
        return $this; 
    } 
 
    /** 
     * Toggles m modifier 
     * @param  boolean $enable Enables or disables m modifier. Default true 
     */ 
    function searchOneLine ( $enable = true ) { 
        if ( $enable ) { 
            $this->addModifier ( 'm' ); 
        } 
        else { 
            $this->removeModifier ( 'm' ); 
        } 
        return $this; 
    } 
 
    /** 
     * Adds the multiple modifier at the end of your expresion 
     * @param  string $value Your expresion 
     */ 
    function multiple ( $value ) { 
 
        $value = $this->sanitize ( $value ); 
 
        switch ( substr ( $value, -1 ) ) { 
            case '+': 
            case '*': 
                break; 
 
            default: 
                $value += '+'; 
                break; 
        } 
 
        $this->add ( $value ); 
 
        return $this; 
    } 
 
    /** 
     * Wraps the current expresion in an `or` with $value 
     * @param  string $value new expression 
     */ 
    function _or ( $value ) { 
        if ( strpos ( $this->prefixes, "(" ) === false ) { 
            $this->prefixes .= "("; 
        } 
        if ( strpos ( $this->suffixes, ")" ) === false ) { 
            $this->suffixes .= ")"; 
        } 
        $this->add ( ")|(" ); 
        if ( $value ) { 
            $this->add ( $value ); 
        } 
        return $this; 
    } 
 
    /** 
     * PHP Magic method to return a string representation of the object. 
     * 
     * @return string 
     */ 
    public function __toString () { 
        return $this->getRegex (); 
    } 
 
    /** 
     * Creates the final regex. 
     * @return string The final regex 
     */ 
    function getRegex () { 
        return "/" . $this->prefixes . $this->source . $this->suffixes . "/" . $this->modifiers; 
    } 
 
    /** 
     * tests the match of a string to the current regex 
     * @param  string $value The string to be tested 
     * @return boolean        true if it's a match 
     */ 
    function test ( $value ) { 
        // php doesn't have g modifier so we remove it if it's there and call preg_match_all() 
        if ( strpos ( $this->modifiers, 'g' ) !== false ) { 
            $this->modifiers = str_replace ( 'g', '', $this->modifiers ); 
            return preg_match_all ( $this->getRegex (), $value ); 
        } 
        return preg_match ( $this->getRegex (), $value ); 
    } 
 
    /** 
     * deletes the current regex for a fresh start 
     */ 
    function clean ( $options =  [ ] ) { 
        $options = array_merge (  [ "prefixes" => "", "source" => "", "suffixes" => "", "modifiers" => "gm", "replaceLimit" => "1" ], $options ); 
        $this->prefixes = $options['prefixes']; 
        $this->source = $options['source']; 
        $this->suffixes = $options['suffixes']; 
        $this->modifiers = $options['modifiers']; // default to global multiline matching 
        $this->replaceLimit = $options['replaceLimit']; // default to global multiline matching 
 
        return $this; 
    } 
 
}
 
 |