2013-05-24 1 views
0

Мое регулярное выражение очень-очень слабое, мне нужно написать письмо [и, надеюсь, понять] регулярное выражение php, чтобы найти фрагмент кода modx в поле содержимого ресурса и извлеките один из атрибутов этого вызова. Вызов будет выглядеть следующим образом:Мне нужен php RegEx, чтобы найти вызов modx snippet в html-контенте

[[ShowVideo? &path=`path/to/somevideo.mp4` &w=`960`&h=`540` &playlist=`true`]] 

или, возможно, называется не-кэшируются

[[!ShowVideo? &path=`path/to/somevideo.mp4` &w=`960`&h=`540` &playlist=`true`]] 

Что мне нужно, чтобы извлечь из этого является «путь/к/somevideo.mp4» значение из атрибута пути ,

Как я могу это сделать?

EDIT:

Спасибо за вашу помощь ребята - здесь завершенная фрагмент кода в случае, если кто интересуется:

<?php 

$rid = $modx->resource->get('id'); // this resource id 

$children = $modx->getChildIds($rid,1); // get one level of child ids 

$pattern = '~\[\[!?ShowVideo[^\]]*&?path=`([^`]*)`~'; // thanks Crayon Violent 

$myPlaylist = ''; // output to placeholder 

$listItems = ''; // list thumbs with link 

$index = 1; // not actually used 

$parents = $modx->getParentIds($rid); // get the parent id array 

if(!$children){ 

    // try siblings 
    $children = $modx->getChildIds($parents[0]); // get children of immediate parent 

    array_unshift($children, $parents[0]); // prepend immediate parent id 

}else{ 

    // must be a parent folder? 
    array_unshift($children, $rid); // prepend this id 

} 

$videos = $children; // just for readbility 

foreach($videos as $video){ 

    $resource = $modx->getObject('modResource', $video); // get the first resource object 

    if ($resource->get('id') == $rid){ // figure out if this is the current video [to add a css class] 

     $current = ' current'; 

    }else{ 

     $current = ''; 

    } 

    if($resource){ 

     $rescontent = $resource->getContent(); // get the unprocessed! content field 

     if(preg_match($pattern, $rescontent, $matches)){ // thanks again crayon! 

      $listItems .= $modx->getChunk('PlayListItems', array(// get the output chunk & populate it's placeholders 

       'videopath' => $modx->makeUrl($resource->get('id')), 
       'thumbnail' => $resource->getTVValue('PageThumbnail'), 
       'current' => $current, 

      )); 

     } 

    } 

    $index++; // again ~ not used 

} 


$myPlaylist = $modx->getChunk('PlayListWrapper', array(// get and populate the wrapper chunk 

    'ListItems' => $listItems, 

)); 


return $myPlaylist; // output! 
+0

Зачем вам это делать? Это не имеет смысла, если вы используете Modx. Вы можете просто использовать '$ path' в вашем ShowVideo-фрагменте. – OptimusCrime

+0

Прости, я не могу. эти фрагменты ShowVideo встроены во вложенную группу полей содержимого ресурсов. В основном я выполняю итерацию через набор ресурсов, которые ищут в них фрагмент ShowVideo. [Я создаю плейлист на основе иерархии папок видеоресурсов.] –

ответ

3
preg_match('~&path=`([^`]*)`~',$string,$match); 
// $match[1] will have the value 

Если он должен быть немного более четко:

preg_match('~\[\[!?ShowVideo[^\]]*&path=`([^`]*)`~',$string,$match); 
// $match[1] will have the value 
+0

Спасибо Crayon, есть это регулярное выражение, из-за которого у меня болит голова. собираюсь возиться с этим прямо сейчас и посмотреть, как это работает. :) –

+0

Это работает довольно хорошо - спасибо Crayon. –

+0

Я изменил выражение на '~ \ [\ [!? ShowVideo [^ \]] * &? Path = '([^'] *) '~', потому что & path = иногда может быть заменен как & path = [by tinymce], похоже, работает, просто интересно, если все еще правильно –

2

Не переусердствуйте, не делайте это sim :

preg_match('#path=`([^`]+)#', $input, $matches); 

Working demo.

+0

Wow - быстрые ответы, спасибо, ребята! Глядя на второе решение Crayon, может быть лучше, поскольку в содержании может быть несколько меток modx. кажется, что вы ищете только внешние фигурные скобки? [но спасибо в любом случае !!] –

+1

Этот просто извлекает значение атрибута «путь». Во втором примере Crayon явно обнаруживаются атрибуты «путь» в элементе «ShowVideo». Это зависит от вас, нужна ли вам такая специфичность. –