用php创建我自己的短代码

时间:2012-11-27 04:00:45

标签: php shortcode

我想创建自己的短代码

在文中我可以输入短代码:

  人们非常好,[gal~路线~100~100],人们非常好   很好,[ga2l~route2~150~150]

在这个表达式中,您可以看到[]标签中的短代码,我希望显示没有此短代码的文本并将其替换为库(使用php include并从短代码中读取路径库)

我认为使用这种方法,你可以看到,但它们都不适合我,但是这里的人可以告诉我一些事情或给我任何可以帮助我的想法

 <?php
 $art_sh_exp=explode("][",html_entity_decode($articulos[descripcion],ENT_QUOTES));

 for ($i=0;$i<count($art_sh_exp);$i++) {

 $a=array("[","]"); $b=array("","");

 $exp=explode("~",str_replace ($a,$b,$art_sh_exp[$i]));


 for ($x=0;$x<count($exp);$x++) { print
 "".$exp[1]."-".$exp[2]."-".$exp[3]."-<br>"; }

 } ?>

谢谢

6 个答案:

答案 0 :(得分:6)

我建议您使用正则表达式查找短代码模式的所有实例。

它使用preg_match_all(文档here)查找所有匹配项,然后使用简单的str_replace(文档here)将已转换的短代码放回字符串中

此代码中包含的正则表达式只是尝试将0与括号[]

之间的字符无限制匹配
$string = "The people are very nice , [gal~route~100~100] , the people are very nice , [ga2l~route2~150~150]";
$regex = "/\[(.*?)\]/";
preg_match_all($regex, $string, $matches);

for($i = 0; $i < count($matches[1]); $i++)
{
    $match = $matches[1][$i];
    $array = explode('~', $match);
    $newValue = $array[0] . " - " . $array[1] . " - " . $array[2] . " - " . $array[3];
    $string = str_replace($matches[0][$i], $newValue, $string);
}

结果字符串现在是

The people are very nice , gal - route - 100 - 100 , the people are very nice , ga2l - route2 - 150 - 150

分两个阶段解决问题

  • 查找所有事件
  • 用新值替换它们

开发和调试更简单。如果您想在一定程度上更改您的短代码如何转换为URL或其他任何内容,它也会更容易。

按照杰克的建议

编辑:,使用preg_replace_callback可以更简单地做到这一点。看他的答案。

答案 1 :(得分:2)

执行此操作的一种方法是使用preg_replace_callback()

function my_replace($match)
{
    // $match[0] is e.g. "[gal~route~100~100]"
    // $match[1] is e.g. "gal~route~100~100"

    // now do whatever you want with the found match
    return join('-', explode('~', $match[1])) . '<br />';
}

// apply callback on all patterns like [*]
preg_replace_callback(
    '/\[([^]]+)\]/', 
    'my_replace',
    html_entity_decode($articulos[descripcion],ENT_QUOTES)
);

答案 2 :(得分:1)

你也可以尝试这样的事情:

$org_text = "Lorem ipsum dolor sit amet, [SHORTCODE_1] adipiscing elit.
Phasellus id orci ac dolor dapibus [SHORTCODE_1] at eu sem.
Nullam pretium bibendum urna et gravida. Donec [SHORTCODE_1] vehicula lectus
nec facilisis. Maecenas vel ante tincidunt, [SHORTCODE_2] 
sem id, tincidunt elit. Integer neque [SHORTCODE_2], ultrices in lore
[SHORTCODE_2], egestas ullamcorper enim.";

$shortcodes_a =  array('[SHORTCODE_1]','[SHORTCODE_2]');
$shortcodes_b =  array('Some text','Some other text');                   

$new_text = '';

$new_text = str_replace($shortcodes_a, $shortcodes_b, $org_text);

echo $new_text;

这会给你:

Lorem ipsum dolor sit amet, Some text adipiscing elit. Phasellus id orci ac dolor dapibus Some text at eu sem. Nullam pretium bibendum urna et gravida. Donec Some text vehicula lectus nec facilisis. Maecenas vel ante tincidunt, Some other text sem id, tincidunt elit. Integer neque Some other text, ultrices in lorem Some other text, egestas ullamcorper enim.

答案 3 :(得分:0)

您可以使用正则表达式匹配方括号内的项目。然后explode()带有分隔符的字符串~以获取其他值(或者您也可以使用正则表达式)。

参考文献:

preg_match()

preg_match_all()

preg_replace()

学习正则表达式的一个很好的参考:http://www.regular-expressions.info/

答案 4 :(得分:0)

我看到了这个并且它有所帮助并思考是否有人想知道一个或多或少的简单版本,至少生成带有内容块的各种短代码的清理版本。 [幻灯片:(幻灯片名称)]或[表格:(表格名称)] (到目前为止,我只将其设置为幻灯片显示位,并认为我会尝试回馈。代码在下面,可以简单地复制到php文件中并查看输出是什么。

<code>
//Regular expression  would be : '/\[(blah:)(.)+\]/'
// The \\2 is an example of backreferencing. This tells pcre that
// it must match the second set of parentheses in the regular expression
// itself, which would be the ([\w]+) in this case. The extra backslash is
// required because the string is in double quotes.
$html = "stupid text here taht is totally lame [slideshow:topLeft] Some more dumb text [slideshow:topright] and finally some more dumb text here.";

preg_match_all('/\[(slideshow:)(.*?)\]/', $html, $matches);
$properArray = array();
$customShortCodes = array();
foreach($matches[0] as $slideKey=>$slideShow)
{
    $matchNoBrackets = str_replace(array('[',']'),'',$slideShow);
    $shortCodeExploded = explode(':', $matchNoBrackets);
$customShortCodes['slideshow'][$slideKey] = $shortCodeExploded[1];
}
$customShortCodes['form'][0] = 'contact us';
$customShortCodes['form'][1] = 'Mulch Count';
//loop through customShortCodes to replace proper values.
$newContent = $html;//assigning original content to new only for comparison testing.
foreach($customShortCodes as $shortCodeKey=>$shortCode)
{
    if($shortCodeKey == 'slideshow')
    {
        print_r($shortCode);
        foreach($shortCode as $show)
        {
            $testingReplacementText = "<strong>$show</strong>";
            $originalShortCode = "[slideshow:$show]";
            $newContent = str_replace($originalShortCode,$testingReplacementText,$newContent);
        }
    }
    if($shortCodeKey == 'form')
    {
        //print_r($shortCode);
    }
}

print_r($customShortCodes);
</code>

以上内容的输出:

  • 原文:这里的愚蠢文字完全是蹩脚的[幻灯片:topLeft] 一些更愚蠢的文字[幻灯片放映:顶部],最后一些更愚蠢 在这里发短信。
  • Revized:这里的愚蠢文字完全是蹩脚的 topLeft 更愚蠢 文字 topright ,最后是一些更愚蠢的文字。

    echo 'Original: '.$html.'
    '; echo 'Revized: '.$newContent.'
    ';

我希望这会有所帮助。我用wordpress短代码创建了这个,以便在我自己的cms上使用。 Real结果将涉及使用ob_start并包含php文件来获得所需的输出。

<code>
ob_start();
include "{$slideshowName}_slideshow.php";//OR pass through params to the file...
$conditionalContent = ob_get_contents();
ob_end_clean();
</code>

答案 5 :(得分:-1)

你的字符串替换参数变量不接受数组值;

str_replace ($a,$b,$art_sh_exp[$i]) /*Here $a , $b are array values so wont work*/

尝试使用以下方法: 1.首先尝试替换字符串'[' 2.然后尝试替换字符串']'

请试试这个;

str_replace (']','',str_replace ('[','',$art_sh_exp[$i]))