2016-02-12 3 views
0

У меня есть система SHORTCODE, что будет срабатывать функция, если короткий код находится на странице загрузки, как так:preg_replace в строке заказа найдено

[[gallery]] 

Проблема мне нужно напечатать любой текст или другой HTML найден между короткими кодами в том порядке, в котором они найдены.

[[gallery]] 
This is a nice gallery 

[[blog id=1]] 
This is a recent blog 

[[video]] 
Here is a cool video! 

то, что я до сих пор это:

если нет [[шорткоды]] найдены, нет необходимости запускать функцию SHORTCODE, мы просто напечатать тело содержания.

  if(!preg_match('#\[\[(.*?)\]\]#', $page_content, $m1)){ 
      print $page_content; 
      } 

это удаляет любые шорткоды и печатает текст, но только печатает его выше всех, которые короткие номера найдены.

  if(preg_match('#\[\[(.*?)\]\]#', $page_content, $m1)){ 
      $theFunction1 = $m1[0]; 
      $page_text = preg_replace('#\[\[(.*?)\]\]#', '',$page_content); 
      print $page_text; 
      } 

если мы находим какие-либо [[шорткоды]], мы петлю через них и передать их функции, чтобы обрабатывать их с помощью обратного вызова.

  if(preg_match_all('#\[\[(.*?)\]\]#', $page_content, $m)){ 
      foreach($m[0] as $theFunction){ 
      print shortcodify($theFunction); 
      } 
      } 

preg_replace не отображает их в порядке $ page_content var, поскольку они найдены. Даже когда я поставил preg_replace в цикле Еогеаспа я получаю результаты, как это:

This is a nice gallery 
    This is a recent blog 
    This is a recent blog 
    [[gallery]] (gallery loads) 


    This is a nice gallery 
    This is a recent blog 
    This is a recent blog 
    [[blog id=1]] (the blog displays) 

    This is a nice gallery 
    This is a recent blog 
    This is a recent blog 
    [[video]] (video plays) 

Итак, как вы можете видеть .. он дублирует все вхождения между короткими номерами. Мне нужно напечатать их по порядку.

ответ

0

Вы печатаете весь $page_text перед вызовом shortcodify для каждого короткого кода.

Я хотел бы сделать что-то вроде:

$page_content = <<<EOD 
[[gallery]] 
This is a nice gallery 

[[blog id=1]] 
This is a recent blog 

[[video]] 
Here is a cool video! 

EOD; 

if(preg_match('#\[\[(.*?)\]\]#', $page_content)){ // there are shortcodes 
    $items = explode("\n", $page_content);  // split on line break --> array of lines 
    foreach($items as $item) { // for each line 
     if(preg_match('#\[\[(.*?)\]\]#', $item)){ // there is a shortcode in this line 
      // replace shortcode by the resulting value 
      $item = preg_replace_callback('#\[\[(.*?)\]\]#', 
         function ($m) { 
          shortcodify($m[1]); 
         }, 
         $item); 
     } 
     // print the current line 
     print "$item\n"; 
    } 
} else { // there are no shortcodes 
    print $page_content; 
} 

function shortcodify($theFunction) { 
    print "running $theFunction"; 
} 

Выход:

running gallery 
This is a nice gallery 

running blog id=1 
This is a recent blog 

running video 
Here is a cool video! 
+0

Спасибо! он работает отлично! –

+0

@SonnyKing: Добро пожаловать, рад, что это помогает. – Toto

Смежные вопросы