8

我想创建自己的简码

在文本中,我可以输入简码,例如:

人很好,[gal~route~100~100],人很好,[ga2l~route2~150~150]

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

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

 <?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>"; }

 } ?>

谢谢

4

6 回答 6

8

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

它使用preg_match_all此处的文档)查找所有出现,然后简单str_replace此处的文档)将转换后的短代码放回字符串中

此代码中包含的正则表达式只是尝试将 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可以更简单地做到这一点。看他的回答。

于 2012-11-27T04:26:37.230 回答
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)
);
于 2012-11-27T04:37:37.807 回答
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.
于 2015-08-03T08:51:09.643 回答
0

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

参考:

preg_match()

preg_match_all()

preg_replace()

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

于 2012-11-27T04:19:06.897 回答
0

我看到了这一点,它有所帮助并想如果有人想知道一个或多或少简单的版本,至少可以生成带有内容块的各种短代码的清理版本。[slideshow:(name of slideshow)] 或 [form:(name of form)] (到目前为止,我只将其设置为幻灯片放映位,并认为我会尝试回馈。代码如下,可以只需将其复制到 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>

以上内容的输出:

  • 原文:这里愚蠢的文字完全是蹩脚的 [slideshow:topLeft] 一些愚蠢的文字 [slideshow:topright] 最后还有一些愚蠢的文字。
  • 修改:这里愚蠢的文字完全是蹩脚的 topLeft 一些更愚蠢的文字 topright 最后是一些愚蠢的文字。

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

我希望这有帮助。我创建这个时考虑到了 wordpress 短代码,以便在我自己的 cms 上使用。真正的最终结果将涉及使用 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>
于 2014-03-05T05:31:00.673 回答
-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]))
于 2012-11-27T04:22:50.873 回答