for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
namespace Kevintweber\HtmlTokenizer;
use Kevintweber\HtmlTokenizer\Tokens\TokenCollection;
use Kevintweber\HtmlTokenizer\Tokens\TokenFactory;
class HtmlTokenizer
{
/** @var boolean */
private $throwOnError;
/** @var string */
private static $allHtml = '';
/**
* Constructor
*/
public function __construct($throwOnError = false)
$this->throwOnError = (boolean) $throwOnError;
}
* Will parse html into tokens.
*
* @param $html string The HTML to tokenize.
* @return TokenCollection
public function parse($html)
self::$allHtml = $html;
$tokens = new TokenCollection();
$remainingHtml = trim((string) $html);
while (mb_strlen($remainingHtml) > 0) {
$token = TokenFactory::buildFromHtml(
$remainingHtml,
null,
$this->throwOnError
);
if ($token === false) {
// Error has occurred, so we stop.
break;
$remainingHtml = $token->parse($remainingHtml);
$tokens[] = $token;
return $tokens;
public static function getPosition($partialHtml)
$position = mb_strrpos(self::$allHtml, $partialHtml);
$parsedHtml = mb_substr(self::$allHtml, 0, $position);
$line = mb_substr_count($parsedHtml, "\n");
if ($line === 0) {
return array(
'line' => 0,
'position' => $position
$lastNewLinePosition = mb_strrpos($parsedHtml, "\n");
'line' => $line,
'position' => mb_strlen(mb_substr($parsedHtml, $lastNewLinePosition))