如何创建短代码功能以在页面中运行脚本?

时间:2018-05-14 04:05:44

标签: php ckeditor

我正在使用ckeditor来实现自定义cms解决方案。它运作良好,但我想设置它,以便管理员可以在textarea输入一些格式化的文本代码,如

{print gallery[1]}
{run gallery.php[1]}
{do gallery.php[1,2,3]}
{gallery.php?id=1&opt=3}  // preferred

它将转换代码以使用提供的选项打印gallery脚本gallery.php的输出。如果我执行以下操作,请在显示页面上显示:

$text = str_replace ("{","<?php",$text);
$text = str_replace ("}","?>",$text);

这打破了页面。使用str_replace可以很好地进行简单的替换,可能是格式化,但不是原样。

备注:2018-05-17

我按照建议使用了preg_match,这让我更接近可用的解决方案。我将以下文本添加到名为introtext的textarea字段中,作为管理员可能:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus mollis convallis justo, vitae pretium libero condimentum et. {simple-gallery.php 1 3} Morbi nibh nibh, blandit sit amet sodales ullamcorper, ultricies vel nulla. {simple-gallery.php 2 3} Quisque cursus erat eu felis vulputate, scelerisque tempor libero egestas. Inte ger vitae dignissim odio, eget congue mauris. Suspendisse mattis efficitur sem, ut sagittis magna sodales eu.

在我的脚本中,我使用preg_match然后拆分结果并得到:

text_to_be_replaced: simple-gallery.php 1 3
Match found and text extrapolated:
script: simple-gallery.php
arg1: 1
arg2: 3

我能够成功包含simple-gallery.php文件并使用include显示第一张幻灯片。此时,当我打印出textarea时,它正在打印括号内的文本。我可以通过执行str_replace并删除文本来解决这个问题,至少在第一次出现时是这样。

然而,我们需要多功能性来在textarea中添加多个画廊,并在introtext中看到上方,下方和中间的自由文本。我的代码:

preg_match_all("/\{(.+?)\}/", $introtext,$results);
$array1 = $results[1];
$text_to_be_replaced1 = "$array1[0]";
$split1 = explode(' ',$text_to_be_replaced1);
$script1 = $split1[0];
$arg1 = $split1[1]; // if needed
$arg2 = $split1[2]; // if needed

echo $introtext; // returns everything including the bracketed text
include ("$script1");

Notes添加了2018-05-20

我修改了代码;除了在图库代码所属的文本区域中输出1(数字1)之外,它正在努力添加参数化的图库或视频脚本,但有些不按顺序排列。修订后的代码:

preg_match_all("/\{(.+?)\}/", $introtext,$results);

foreach($results[1] as $gallery){
  $split = explode(' ',$gallery);
  $arg1 = isset($split[0]) ? $split[0] : -1;
  $arg2 = isset($split[1]) ? $split[1] : -1;
  $arg3 = isset($split[2]) ? $split[2] : -1;
  $html = include ("$arg1");
  $introtext = preg_replace("/\{" . $gallery . "\}/", $html, $introtext);
}

echo $introtext;

显示如下:

gallery #1
gallery #2
gallery/video #3

text
1
text
1
text
1

请参阅演示:http://www.dottedi.biz/demo/code/public/shortcode/shortcode.php

2 个答案:

答案 0 :(得分:0)

使用正则表达式后:preg_match_all("/\{(.+?)\}/", $introtext,$results);

您可以这样做:

foreach($results[1] as $gallery){
    $split = explode(' ',$gallery);
    $arg1 = isset($split1[0]) ? $split1[0] : -1; // if needed && check if the parameter exists before trying to access it
    $arg2 = isset($split1[1]) ? $split1[1] : -1; // if needed && check if the parameter exists before trying to access it
    $html = 'your code for the gallery';
    $introtext = preg_replace("/\{" . $gallery . "\}/", $html, $introtext);
}

将使用您的实际图库代码替换{gallery.php 1 2}的实例。然后转到下一个匹配,再次执行相同的操作,您只需将参数传递给图库代码。

答案 1 :(得分:0)

want to improve above answer:

preg_match_all("/\{(.+?)\}/", $introtext, $results);
foreach ($results[1] as $gallery) {
    $split = explode(' ', $gallery);
    $arg1 = isset($split[0]) ? $split[0] : -1;
    $arg2 = isset($split[1]) ? $split[1] : -1;
    $arg3 = isset($split[2]) ? $split[2] : -1;

    ob_start();
    include "$arg1";
    $html = ob_get_contents();
    ob_end_clean();
    $introtext = preg_replace("/\{" . $gallery . "\}/", $html, $introtext);
}
echo $introtext;
---------------