2016-06-10 2 views
1

Я довольно новичок в «продвинутом» PHP, и я борюсь с этой проблемой уже неделю. Я прочитал почти все на этом форуме, чтобы найти решение, но ничего не получилось.PHP Замените [plugin-something] с include_once

Я хочу получить контент из базы данных и заменить весь текст как [plugin-example] на include_once (example.php) Причина заключается в том, чтобы сделать что-то похожее на «короткий код» для системы управления контентом ,

Я пробовал несколько кодов, и этот является ближайшим к моему решению (я думаю/надеюсь). Проблема в том, что это заменяет оба [плагина] только последним значением соответствия (в данном случае слайдер).

<?php 
//get database row 
while($page = mysqli_fetch_array($hl_page)){ 

//regex 
$search = "/\[plugin-(.*)\]/"; 

//get all matches with search 
$content = htmlspecialchars_decode("This is my blog 
[plugin-blog] 
And this is my slider 
[plugin-slider]"); 
preg_match_all($search, $content , $matches); 

foreach($matches[1] as $match) { 
$match; 
} 
enter code here 
//get file 
ob_start(); 
include_once(''.$match.'.php'); 
$replace = ob_get_contents(); 
ob_end_clean(); 


//echo content from page 
echo preg_replace($search,$replace,$content); 

}?>  

, которые кодируют выходы:

текстовое содержание [include_once ('slider.php')] < --- должно быть blog.php более текстовое содержание [include_once ('слайдер. PHP '] < --- это один хороший

Вся помощь будет очень ценна

ответ

-1

Если я хорошо понимаю, что вы пытаетесь сделать, более простой способ использования preg_split:

$content = <<<'EOD' 
This is my blog 
[plugin-blog] 
And this is my slider 
[plugin-slider] 
EOD; 

$parts = preg_split('~\[plugin-([^]]+)]~', $content, -1, PREG_SPLIT_DELIM_CAPTURE); 

foreach ($parts as $k => $v) { 
    if ($k & 1) 
     include_once("$v.php"); 
    else 
     echo htmlspecialchars_decode($v); 
} 
+0

Он работает именно так, как я хотел, спасибо! – Saypontigohe

+0

Небольшой вопрос, могу ли я использовать несколько разных заменяет в том же $ content здесь? Например, я хочу иметь короткий код, например [container], чтобы я мог разместить контейнер в cms? Возможно ли это в этом методе и где я должен это делать? – Saypontigohe

+0

@Saypontigohe: Нет с этим методом вы не можете иметь дело с различными типами тегов. Если вы хотите это сделать, метод 'preg_replace_callback' будет более простым. Однако вы всегда можете использовать' preg_split', чтобы захватить весь контент тег и разбор его во второй раз, чтобы знать, что с ним делать: '\ [([^]] +)]' * (таким образом, вы избегаете создания гигантских строк и бесполезных конкатенаций) *. –

0

Поместите замену внутри цикла Еогеасп:

foreach($matches[1] as $match) { 
    //get file 
    ob_start(); 
    include_once(''.$match.'.php'); 
    $replace = ob_get_contents(); 
    ob_end_clean(); 

    $content = preg_replace($search, $replace, $content); 
} 
echo $content; 
+0

Я пытался что-то подобное, но проблема в том, что «эхо» показано, как много поскольку контент имеет плагины. Я хочу только показать полный контент один раз, заменив замену. Таким образом, я получаю только 2 × [плагин-блог] сейчас :( – Saypontigohe

+0

@Saypontigohe: переместите 'echo' после цикла, см. Мое редактирование. – Toto

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