正则表达式从[shortcode]中提取变量

Rya*_*ich 3 php regex drupal shortcode

将一些内容从WordPress迁移到Drupal之后,我得到了我需要转换的som短代码:

字符串内容:

不相关的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"
)
Run Code Online (Sandbox Code Playgroud)

并且优选地处理短代码的多个实例.

我想可以用preg_match_all()完成,但我没有运气.

Ora*_*ill 8

这会给你你想要的.

$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);
Run Code Online (Sandbox Code Playgroud)

预计您将面临处理短代码的下一个挑战,您可以使用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;
Run Code Online (Sandbox Code Playgroud)


f60*_*76f 7

您可以使用以下RegEx来匹配变量:

$regex = '/(\w+)\s*=\s*"(.*?)"/';
Run Code Online (Sandbox Code Playgroud)

我建议首先匹配sublimevideo短代码,并使用以下RegEx将其转换为字符串:

$pattern = '/\[sublimevideo(.*?)\]/';
Run Code Online (Sandbox Code Playgroud)

为了获得正确的数组键,我使用了以下代码:

// $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];
Run Code Online (Sandbox Code Playgroud)

这将返回以下数组:(您请求的那个)

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
)
Run Code Online (Sandbox Code Playgroud)