loadFile($sBibtexFile) && $oBibtex->parse()) { foreach ($oBibtex->data as $aEntry) { if ($aEntry['type'] != 'comment') { $aEntries[] = $aEntry['cite']; } } } } else { $aEntries = explode("\n", file_get_contents($sEntriesFile)); } /* Prepare temporary directory */ @mkdir($sTmpDir); chdir($sTmpDir); copy($sBibtexFile, 'reference.bib'); /* Loop over entries */ @unlink($sFailFile); foreach ($aEntries as $iKey => $sEntry) { if (!empty($sEntry)) { printf('Checking "%s"... ', $sEntry); command('rm check*.*'); file_put_contents('check.tex', sprintf($sLatex, $sEntry)); command('latex -interaction=nonstopmode check'); command('bibtex check'); command('latex -interaction=nonstopmode check'); $sLog = file_get_contents('check.log'); if (strpos($sLog, 'inputenc Error') === false) { printf("success!\n"); unset($aEntries[$iKey]); } else { printf("fail!\n"); file_put_contents($sFailFile, sprintf("%s\n", $sEntry), FILE_APPEND); } } } /* Clean up */ command('rm check*.*'); unlink('reference.bib'); /* Keep track of failed files */ file_put_contents($sEntriesFile, implode("\n", $aEntries)); /* Helper functions */ function command($sCommand) { ob_start(); exec(sprintf('%s 2>&1', $sCommand)); return ob_get_clean(); }