2013-08-19 3 views
0

Я нашел эту идею в фигурном парсере онлайн, и я хочу ее развить. Оригинальный парсер предназначен для передачи youtube.php: написание фигурного парсера

class curly 
{ 
    /** 
    * Replace the macros in an input string 
    * @param string $input 
    * @return string 
    */ 
    public function replace ($input) { 
     //return preg_replace("/\{{2}([a-z]+\|.+)\}{2}/Ue",'$this->_replace("\\1")',$input); // original 
     return preg_replace("/\{{2}(([a-z]+\|.+)|([a-z\_]))\}{2}/Ue",'$this->_replace("\\1")',$input); 
    } 

    /** 
    * Run the replacement code on a given macro string 
    * @param string $input 
    * @return string 
    */ 
    private function _replace ($input) { 

     print_r($input); 

     list ($name,$params) = explode("|",$input); 

     if (method_exists($this,$name)) { 
      return $this->$name($params); 
     }else{ 
      if($input === 'email_compnay') return '[email protected]'; 
       else if($input === 'email_personal') return '[email protected]'; 
     } 

     throw new Exception ("Unrecognised macro: {$name}.",500); 
    } 

    /** 
    * Replaces a YouTube curly 
    * @param string $params 
    * @return string 
    */ 
    private function youtube ($params) { 
     parse_str($params); 

     // set defaults 
     if (!isset($id)) { $id = "ykwqXuMPsoc"; } 
     if (!isset($width)) { $width = 560; } 
     if (!isset($height)) { $height = 315; } 

     // output the final HTML 
     return "<iframe width=\"{$width}\" height=\"{$height}\" src=\"http://www.youtube.com/embed/{$id}\" frameborder=\"0\" allowfullscreen></iframe>"; 
    } 
} 

пример использования, который работает,

$curly = new curly(); 
$input = '<p>{{youtube|id=ykwqXuMPsoc&width=560&height=315}}</p>'; 
echo $curly->replace($input); 
// return <p><iframe width="560" height="315" src="http://www.youtube.com/embed/ykwqXuMPsoc" frameborder="0" allowfullscreen></iframe></p> 

другой пример, который не работает,

$input = '<p>{{email_company}}</p>'; 
echo $curly->replace($input); 
// return <p>{{email_company}}</p> 

когда {{email_company}} тогда он должен вернуть [email protected], но это дает мне {{email_company}} вместо .. .

Это что-то hing не правильно в этом регулярном выражении?

"/\{{2}(([a-z]+\|.+)|([a-z\_]))\}{2}/Ue" 
+0

Я сожалею, но то, что вы пытаетесь сделать точно. Я не знаю PHP, но я могу помочь с регулярным выражением, если я знаю, чего вы пытаетесь достичь именно? –

+0

спасибо. Я думаю, мне нужно регулярное выражение, которое может захватить 'email_company' или' youtube | id = ykwqXuMPsoc & width = 560 и height = 315' из двойных фигурных скобок. Является ли это возможным? – laukok

+0

текущее регулярное выражение только захватывает 'youtube | id = ykwqXuMPsoc & width = 560 & height = 315', но не' email_company' ... – laukok

ответ

2

Я думаю, что нужно регулярное выражение, которое в состоянии захватить email_company или YouTube | ID = ykwqXuMPsoc & ширина = 560 высота = & 315 от двойных фигурных скобках. Является ли это возможным?

Да, это возможно. Вы можете просто использовать это регулярное выражение: \{{2}([^}]*)\}{2}, и вы можете проверить его на этом Regex 101 Demo.

Если по каким-либо причинам вам не нравится это выражение или, как вы сказали в своем комментарии, оно не работает для вас (что меня смущает почему?), то вы можете изменить оригинальное выражение, которое вы отправили на после одного и всё оболочки отлично работает:

/\{{2}(([a-z]+\|.+)|([a-z\_]+))\}{2}/Ue 
//      ^
//       | 
//     Notice the added + sign, your previous expression only 
//     matched a single character. 

а вот Regex 101 Demo

+0

спасибо, добавив '+', и он просто отлично работает! Большое спасибо! – laukok

+0

Мне нравится '\ {{2 } ([^}] *) \} {2} ', но это не работает в php i dunno, почему ... – laukok

+0

Когда-то у меня есть повторное появление фигурных скобок в строке - '

{{email_company}} { {email_personal}}

' – laukok