2013-08-12 2 views
2

После переноса некоторого содержимого с WordPress на Drupal, у меня сомы шорткодов, что мне нужно преобразовать: содержаниеRegex экстракт переменные из [шорткода]

Строки:

Ненужных 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"] .. более не относящийся к делу текст.

Мне нужно найти все переменные в шорткоде [sublimevideo ...] и превратить его в массив:

Array (
    class => "sublime" 
    poster => "http://video.host.com/_previews/600x450/sbx-60025-00-da-FMT.png" 
    src1 => "http://video.host.com/_video/H.264/LO/sbx-60025-00-da-FMT.m4v" 
    src2 => "(hd)http://video.host.com/_video/H.264/HI/sbx-60025-00-da-FMT.m4v" 
    width => "560" 
    height => "315" 
) 

И желательно обрабатывать несколько экземпляров шорткода.

Я думаю, это можно сделать с помощью preg_match_all(), но мне не повезло.

+0

Вы должны показать, что вы пробовали, мы не являемся бесплатной программой кодирования. Эта задача может стать довольно «трудной», но одним из лучших решений будет использование рекурсивного шаблона для соответствия вложенным скобкам. Я имею в виду, что если содержимое этого короткого кода имеет '[]', то ниже регулярных выражений все провалится. Покажите, что вы пробовали, я могу вам помочь. – HamZa

ответ

6

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

$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]; 

Это возвращает foll (тот, который вы запросили)

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 
) 
+0

Возможно ли вам предоставить то же самое в C#? –

7

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

$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; 
+1

Используйте неровный шаблон '. +?'в противном случае он будет соответствовать до последнего'] 'скобки (на входе) :) – HamZa

+0

@HamZa Снова вы закрепляете свое положение как бога регулярного выражения. :) – Orangepill

+0

Hooo ~ Я не так хорош, на SO есть несколько великих гуру регулярных выражений, которые намного лучше меня, но мы учимся! :-) – HamZa

-1

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

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

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

+0

Выдающийся, имея в виду, что OP хотел Drupal (а не WordPress). – ggdx