Мое регулярное выражение очень-очень слабое, мне нужно написать письмо [и, надеюсь, понять] регулярное выражение 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!
Зачем вам это делать? Это не имеет смысла, если вы используете Modx. Вы можете просто использовать '$ path' в вашем ShowVideo-фрагменте. – OptimusCrime
Прости, я не могу. эти фрагменты ShowVideo встроены во вложенную группу полей содержимого ресурсов. В основном я выполняю итерацию через набор ресурсов, которые ищут в них фрагмент ShowVideo. [Я создаю плейлист на основе иерархии папок видеоресурсов.] –