Как разобрать короткий код для извлечения параметров? [Дубликат]

Используя ответ Prestaul , я добавил несколько проверок, и я предпочитаю использовать способ jQuery.




function imgError(image, type) {
    if (typeof jQuery !== 'undefined') {
       var imgWidth=$(image).attr("width");
       var imgHeight=$(image).attr("height");

        // Type 1 puts a placeholder image
        // Type 2 hides img tag
        if (type == 1) {
            if (typeof imgWidth !== 'undefined' && typeof imgHeight !== 'undefined') {
                $(image).attr("src", "http://lorempixel.com/" + imgWidth + "/" + imgHeight + "/");
            } else {
               $(image).attr("src", "http://lorempixel.com/200/200/");
            }
        } else if (type == 2) {
            $(image).hide();
        }
    }
    return true;
}

2
задан Ryanowich 12 August 2013 в 21:31
поделиться

3 ответа

Как описано в в этом ответе , я предлагаю разрешить WordPress выполнять вашу работу с помощью функции get_shortcode_regex().

 $pattern = get_shortcode_regex();
 preg_match_all("/$pattern/",$wp_content,$matches);

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

-1
ответ дан Community 19 August 2018 в 02:53
поделиться
  • 1
    Выдающийся, имея в виду, что OP хотел Drupal (а не WordPress). – ggdx 18 November 2014 в 19:00

Вы можете использовать следующий RegEx для соответствия переменным:

$regex = '/(\w+)\s*=\s*"(.*?)"/';

Я бы предложил сначала совместить короткий код sublimevideo и получить его в строку со следующим RegEx:

$pattern = '/\[sublimevideo(.*?)\]/';

Чтобы получить правильные ключи массива, я использовал этот код:

// $string is string content you specified
preg_match_all($regex, $string, $matches);

$sublimevideo = array();
for ($i = 0; $i < count($matches[1]); $i++)
    $sublimevideo[$matches[1][$i]] = $matches[2][$i];

Это возвращает следующий массив: (тот, который вы запросили)

Array
(
    [class] => sublime
    [poster] => http://video.host.com/_previews/600x450/sbx-60025-00-da-ANA.png
    [src1] => http://video.host.com/_video/H.264/LO/sbx-60025-00-da-ANA.m4v
    [src2] => (hd)http://video.host.com/_video/H.264/HI/sbx-60025-00-da-ANA.m4v
    [width] => 560
    [height] => 315
)
6
ответ дан f605dcf7dc5542e93ae9cd76f 19 August 2018 в 02:53
поделиться
  • 1
    Возможно ли вам предоставить то же самое в C #? – Garth Sebastian 29 June 2017 в 03:01

Это даст вам то, что вы хотите.

$data = 'Irrelevant tekst... [sublimevideo class="sublime" poster="http://video.host.com/_previews/600x450/sbx-60025-00-da-ANA.png" src1="http://video.host.com/_video/H.264/LO/sbx-60025-00-da-ANA.m4v" src2="(hd)http://video.host.com/_video/H.264/HI/sbx-60025-00-da-ANA.m4v" width="560" height="315"] ..more irrelevant text.';

$dat = array();
preg_match("/\[sublimevideo (.+?)\]/", $data, $dat);

$dat = array_pop($dat);
$dat= explode(" ", $dat);
$params = array();
foreach ($dat as $d){
    list($opt, $val) = explode("=", $d);
    $params[$opt] = trim($val, '"');
}

print_r($params);

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

$data = 'Irrelevant tekst... [sublimevideo class="sublime" poster="http://video.host.com/_previews/600x450/sbx-60025-00-da-ANA.png" src1="http://video.host.com/_video/H.264/LO/sbx-60025-00-da-ANA.m4v" src2="(hd)http://video.host.com/_video/H.264/HI/sbx-60025-00-da-ANA.m4v" width="560" height="315"] ..more irrelevant text.';

function processShortCode($matches){
    // parse out the arguments
    $dat= explode(" ", $matches[2]);
    $params = array();
    foreach ($dat as $d){
        list($opt, $val) = explode("=", $d);
        $params[$opt] = trim($val, '"');
    }
    switch($matches[1]){
        case "sublimevideo":
            // here is where you would want to return the resultant markup from the shorttag call.
             return print_r($params, true);        
    }

}
$data = preg_replace_callback("/\[(\w+) (.+?)]/", "processShortCode", $data);
echo $data;
7
ответ дан Orangepill 19 August 2018 в 02:53
поделиться
  • 1
    Используйте шаблон ungreedy .+?, иначе он будет соответствовать до последней скобки ] (на входе) :) – HamZa 12 August 2013 в 22:03
  • 2
    @HamZa Снова вы цементируете свое положение как бога реджекса. :) – Orangepill 12 August 2013 в 22:06
  • 3
    Hooo ~ Я не так хорош, есть несколько великих гуру regex на SO, которые намного лучше меня, но мы учимся! :-) – HamZa 12 August 2013 в 22:09
Другие вопросы по тегам:

Похожие вопросы: