function question_find_file_links_from_html($html, $courseid) { global $CFG; $baseurl = question_file_links_base_url($courseid); $searchfor = '!' . '(<\\s*(a|img)\\s[^>]*(href|src)\\s*=\\s*")' . $baseurl . '([^"]*)"' . '|' . '(<\\s*(a|img)\\s[^>]*(href|src)\\s*=\\s*\')' . $baseurl . '([^\']*)\'' . '!i'; $matches = array(); $no = preg_match_all($searchfor, $html, $matches); if ($no) { $rawurls = array_filter(array_merge($matches[5], $matches[10])); //array_filter removes empty elements //remove any links that point somewhere they shouldn't foreach (array_keys($rawurls) as $rawurlkey) { if (!($cleanedurl = question_url_check($rawurls[$rawurlkey]))) { unset($rawurls[$rawurlkey]); } else { $rawurls[$rawurlkey] = $cleanedurl; } } $urls = array_flip($rawurls); // array_flip removes duplicate files // and when we merge arrays will continue to automatically remove duplicates } else { $urls = array(); } return $urls; }
function find_file_links($question, $courseid) { $urls = array(); /// Question image if ($question->image != '') { if (substr(strtolower($question->image), 0, 7) == 'http://') { $matches = array(); //support for older questions where we have a complete url in image field if (preg_match('!^' . question_file_links_base_url($courseid) . '(.*)!i', $question->image, $matches)) { if ($cleanedurl = question_url_check($urls[$matches[2]])) { $urls[$cleanedurl] = null; } } } else { if ($question->image != '') { if ($cleanedurl = question_url_check($question->image)) { $urls[$cleanedurl] = null; //will be set later } } } } /// Questiontext and general feedback. $urls += question_find_file_links_from_html($question->questiontext, $courseid); $urls += question_find_file_links_from_html($question->generalfeedback, $courseid); /// Answers, if this question uses them. if (isset($question->options->answers)) { foreach ($question->options->answers as $answerkey => $answer) { /// URLs in the answers themselves, if appropriate. if ($this->has_html_answers()) { $urls += question_find_file_links_from_html($answer->answer, $courseid); } /// URLs in the answer feedback. $urls += question_find_file_links_from_html($answer->feedback, $courseid); } } /// Set all the values of the array to the question object if ($urls) { $urls = array_combine(array_keys($urls), array_fill(0, count($urls), array($question->id))); } return $urls; }
function find_file_links($question, $courseid) { $urls = array(); if ($question->options->backgroundmedia->media != '') { if (substr(strtolower($question->options->backgroundmedia->media), 0, 7) == 'http://') { $matches = array(); //support for older questions where we have a complete url in image field if (preg_match('!^' . question_file_links_base_url($courseid) . '(.*)!i', $question->options->backgroundmedia->media, $matches)) { if ($cleanedurl = question_url_check($urls[$matches[2]])) { $urls[$cleanedurl] = null; } } } else { if ($question->options->backgroundmedia->media != '') { if ($cleanedurl = question_url_check($question->options->backgroundmedia->media)) { $urls[$cleanedurl] = null; //will be set later } } } } foreach ($question->options->media as $media) { if ($media->media != '') { if (substr(strtolower($media->media), 0, 7) == 'http://') { $matches = array(); if (preg_match('!^' . question_file_links_base_url($courseid) . '(.*)!i', $media->media, $matches)) { if ($cleanedurl = question_url_check($urls[$matches[2]])) { $urls[$cleanedurl] = null; } } } else { if ($media->media != '') { if ($cleanedurl = question_url_check($media->media)) { $urls[$cleanedurl] = null; //will be set later } } } } $urls += question_find_file_links_from_html($media->questiontext, $courseid); } $urls += question_find_file_links_from_html($question->options->feedbackok, $courseid); $urls += question_find_file_links_from_html($question->options->feedbackmissed, $courseid); //set all the values of the array to the question object if ($urls) { $urls = array_combine(array_keys($urls), array_fill(0, count($urls), array($question->id))); } $urls = array_merge_recursive($urls, parent::find_file_links($question, $courseid)); return $urls; }