Kontynuujemy prace nad parserem wykorzystującym regex. Zbliżamy się do napisania frameworka MVC. Do dzieła.

Kod z lekcji poprzedniej:

<?php 
class SingleTagParser {
    public static function br2br($text){
        return preg_replace('/\[\/?br\]/', "</br>", $text);
    }

    public static function hr2hr($text){
        return preg_replace('/\[\/?hr\]/', "<hr>", $text);
    }
}
echo htmlspecialchars(SingleTagParser::hr2hr("<h1>Blabla</h1>[/hr]<h2>Bla</h2>[hr]"));
// <h1>Blabla</h1>
// <hr>
// <h2>Bla</h2>
// <hr>

Chcemy to uporządkować. Zacznijmy od wzorców i ich zamienników:

class SingleTagParser {
    protected static $patterns = [
            [
                "pattern" => '/\[\/?br\]/',
                "replace" => "</br>" 
            ],
            [
                "pattern" => '/\[\/?hr\]/',
                "replace" => "<hr>" 
            ]
        ];
//(...)
}

Okej, teraz wywalamy metody br2br oraz hr2hr, zastępując je metodą searchAndReplace:

<?php 
class SingleTagParser {
    protected static $patterns = [
            [
                "pattern" => '/\[\/?br\]/',
                "replace" => "</br>" 
            ],
            [
                "pattern" => '/\[\/?hr\]/',
                "replace" => "<hr>" 
            ]
        ];

    public static function searchAndReplace($source){
        foreach(self::$patterns as $pattern ){
            $source = preg_replace($pattern['pattern'], $pattern['replace'], $source);
        }
        return $source;
    }
}
echo SingleTagParser::searchAndReplace("<h1>Heading</h1>[hr]<p>Para[/br]</p>[br][br][br]<p>Para</p>");

Wszystko działa jak należy. Parser będziemy rozbudowywać.