Вам не нужно выделять вручную документы из Solr в PHP. Solr уже предоставляет функции выделения .
Выполнение запроса Solr, например http://path/to/solr:8983/?q=keyword&hl=true&hl.fl=title,text
, возвратит что-то вроде:
<result name="response" numFound="1" start="0">
<doc>
<str name="id">myDocumentId</str>
<str name="title">The title contains keyword</str>
<str name="description">Keywords, keyword is highlighted.</str>
</doc>
</result>
<lst name="highlighting">
<lst name="myDocumentId">
<str name="title">The title contains <em>keyword</em></str>
<str name="description"><em>Keyword</em>s, <em>keyword</em> is highlighted.</str>
</lst>
</lst>
Теперь все, что вам нужно сделать, это соответствоватьдокумент id
в result
и lst name="highlighting"
(использование Xpath, вероятно, самый простой способ):
//lst[@name='highlighting']/lst[@name='myDocumentId']/*
Проблема с DOM заключается в том, что при запросе * он удаляет теги HTML / XML1015 *, поэтому вы выделяете теги (<em>
), которые будут удалены.Вы должны использовать рекурсивную функцию, чтобы извлечь ее со всеми тегами, или более простое решение - использовать SimpleXML с его asXML
методом:
$sxml = new SimpleXMLElement(file_get_contents('doc.xml'));
$nodes = $sxml->xpath("//lst[@name='highlighting']/lst[@name='myDocumentId']/*");
foreach ($nodes as $node) {
$field = $node->attributes()->name;
$tag = $node->getName();
$value = $node->asXML();
$value = preg_replace("/(<$tag name=\"$field\">|<\/$tag>)/", '', $value);
}