public function parse()
{
$matches = array();
$res = preg_match($this->options['_requireStrictFileFormat'] ? self::PATTERN_STRICT : self::PATTERN_LOOSE, $this->fileContent, $matches);
if ($res === false || $res === 0) {
throw new \Exception($this->filename . ' is not a proper .srt file.');
}
$this->setLineEnding($matches[1]);
$bom = pack('CCC', 0xef, 0xbb, 0xbf);
$matches = explode($this->lineEnding . $this->lineEnding, trim($matches[0], $bom . $this->lineEnding));
$subtitleOrder = 1;
$subtitleTime = '';
foreach ($matches as $match) {
$subtitle = explode($this->lineEnding, $match, 3);
$timeline = explode(' --> ', $subtitle[1]);
$subtitleTimeStart = $timeline[0];
$subtitleTimeEnd = $timeline[1];
if (!$this->options['_requireStrictFileFormat']) {
$subtitleTimeStart = $this->cleanUpTimecode($subtitleTimeStart);
$subtitleTimeEnd = $this->cleanUpTimecode($subtitleTimeEnd);
}
$passedValidation = true;
if ($subtitle[0] != $subtitleOrder++) {
$errorMsg = 'Invalid subtitle order index: ' . $subtitle[0];
$passedValidation = false;
} elseif (!$this->validateTimelines($subtitleTimeStart, $subtitleTimeEnd, !$this->options['_requireStrictFileFormat'])) {
$errorMsg = 'Ending time invalid: ' . $subtitleTimeEnd;
$passedValidation = false;
} elseif ($this->options['_requireStrictFileFormat'] && !$this->validateTimelines($subtitleTime, $subtitleTimeStart, true)) {
$errorMsg = 'Starting time invalid: ' . $subtitleTimeStart;
$passedValidation = false;
}
if (!$passedValidation) {
throw new \Exception($this->filename . " is not a proper .srt file. ({$subtitleTimeStart} --> {$subtitleTimeEnd}: {$errorMsg})");
}
$subtitleTime = $subtitleTimeEnd;
$cue = new SubripCue($timeline[0], $timeline[1], $subtitle[2]);
$cue->setLineEnding($this->lineEnding);
$this->addCue($cue);
}
return $this;
}