Создайте свой собственный шорткод с помощью php


Я хочу создать свой собственный шорткод

В тексте я могу указать шорткод, например :

Люди очень милые, [gal~маршрут~100~100], люди очень милые, [ga2l~маршрут 2~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>"; }

 } ?>

Спасибо

Author: Robert, 2012-11-27

6 answers

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

Он использует 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

Разбив проблему на 2 этапа

  • Поиск всех вхождений
  • Замена их новыми значениями

Проще разрабатывать и отлаживать. Это также облегчает задачу, если вы хотите в какой-то момент изменить способ перевода ваших коротких кодов в URL-адреса или что-то еще.

Редактировать: как предложил Джек, использование preg_replace_callback позволило бы сделать это проще. Смотрите его ответ.

 6
Author: emartel, 2012-11-27 04:45:38

Один из способов сделать это - использовать 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
Author: Ja͢ck, 2012-11-27 04:37:37

Вы также можете попробовать что-то вроде этого:

$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.
 1
Author: Marcin Rogala, 2015-08-03 08:51:09

Вы можете использовать регулярное выражение для сопоставления элементов внутри квадратных скобок. А затем explode() строка с разделителем в виде ~, чтобы получить другие значения (или вы также можете использовать регулярное выражение для этого).

Ссылки:

Preg_матч()

Прег_матч_алл()

Preg_replace - Место()

Хороший справочник для изучения регулярных выражений: http://www.regular-expressions.info/

 0
Author: Akhilesh B Chandran, 2012-11-27 04:19:06

Я увидел это, и это помогло, и подумал, что если кто-то захочет узнать более или менее простую законченную версию, чтобы, по крайней мере, сгенерировать очищенную версию различных коротких кодов с блоком содержимого. [слайд-шоу: (название слайд-шоу)] или [форма: (название формы)] (Пока я настроил его только на слайд-шоу и подумал, что попробую вернуть. код приведен ниже и может быть просто скопирован в 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] Еще немного тупого текста [слайд-шоу: вверху справа] и, наконец, еще немного тупого текста здесь.
  • Исправлено: глупый текст здесь, он совершенно неубедительный 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>
 0
Author: Joe, 2014-03-05 05:31:00

Ваши переменные параметра замены строки не будут принимать значения массива;

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]))
 -1
Author: logan, 2012-11-27 04:22:50