Существует много способов обработки HTML / XML DOM, о которых большинство уже упоминалось. Следовательно, я не буду пытаться их перечислить.
Я просто хочу добавить, что лично я предпочитаю использовать расширение DOM и почему:
И хотя я пропускаю возможность использования селекторов CSS для DOMDocument
, существует довольно простой и удобный способ добавления эта функция: подклассификация DOMDocument
и добавление JS-подобных методов querySelectorAll
и querySelector
в ваш подкласс.
Для разбора селекторов я рекомендую использовать очень минималистический компонент CssSelector из рамки Symfony , Этот компонент просто переводит селектора CSS в селектора XPath, которые затем могут быть загружены в DOMXpath
для получения соответствующего Nodelist.
Затем вы можете использовать этот (еще очень низкий уровень) подкласс в качестве основы для более классы высокого уровня, предназначенные, например. проанализируйте очень специфические типы XML или добавьте больше поведение, подобное jQuery.
Ниже приведен код моей библиотеки DOM-Query и использует описанную вами технику.
Для синтаксического анализа HTML:
namespace PowerTools;
use \Symfony\Component\CssSelector\CssSelector as CssSelector;
class DOM_Document extends \DOMDocument {
public function __construct($data = false, $doctype = 'html', $encoding = 'UTF-8', $version = '1.0') {
parent::__construct($version, $encoding);
if ($doctype && $doctype === 'html') {
@$this->loadHTML($data);
} else {
@$this->loadXML($data);
}
}
public function querySelectorAll($selector, $contextnode = null) {
if (isset($this->doctype->name) && $this->doctype->name == 'html') {
CssSelector::enableHtmlExtension();
} else {
CssSelector::disableHtmlExtension();
}
$xpath = new \DOMXpath($this);
return $xpath->query(CssSelector::toXPath($selector, 'descendant::'), $contextnode);
}
[...]
public function loadHTMLFile($filename, $options = 0) {
$this->loadHTML(file_get_contents($filename), $options);
}
public function loadHTML($source, $options = 0) {
if ($source && $source != '') {
$data = trim($source);
$html5 = new HTML5(array('targetDocument' => $this, 'disableHtmlNsInDom' => true));
$data_start = mb_substr($data, 0, 10);
if (strpos($data_start, '') === 0) {
$html5->loadHTML($data);
} else {
@$this->loadHTML('');
$t = $html5->loadHTMLFragment($data);
$docbody = $this->getElementsByTagName('body')->item(0);
while ($t->hasChildNodes()) {
$docbody->appendChild($t->firstChild);
}
}
}
}
[...]
}
См. также Анализ XML-документов с помощью селекторов CSS создателем Symfony Фабьеном Потенцером по его решению создать компонент CssSelector для Symfony и как используйте его.
Оба одинаково быстры, но = "..."
понятнее.
Если вы действительно хотите быстро, используйте assign
и укажите размер:
test2.assign("Hello again", sizeof("Hello again"));
// or
test2.assign("Hello again", 12);
Таким образом , требуется только одно распределение. (Вы также могли .reserve()
получить достаточно памяти, чтобы получить тот же эффект.)