Здесь нет действительно хорошего способа сделать это на уровне Xpath.PHP имеет только Xpath 1.0 и поддерживает только основные строковые операции.Ничто, что может принять во внимание язык / язык.Однако в самом PHP есть что-то для этого в ext/intl
.
. Так что извлекайте текстовое содержимое узла элемента абзаца, используя DOM + Xpath в качестве строки, и извлекайте из него первое предложение.
IntlBreakIterator
может разбить строку в соответствии с правилами, определенными для локали / языка.
$html = <<<'HTML'
<p>
A federal agency is recommending that White House adviser Kellyanne Conway be
removed from federal service saying she violated the Hatch Act on numerous
occasions. The office is unrelated to Robert Mueller and his investigation.
</p>
HTML;
$document = new DOMDocument();
$document->loadXML($html);
$xpath = new DOMXpath($document);
// fetch the first paragraph in the document as string
$summary = $xpath->evaluate('string((//p)[1])');
// create a break iterator for en_US sentences.
$breaker = IntlBreakIterator::createSentenceInstance('en_US');
// replace line breaks with spaces before feeding it to the breaker
$breaker->setText(str_replace(["\r\n", "\n"], '', $summary));
$firstSentence = '';
// iterate the sentences
foreach ($breaker->getPartsIterator() as $sentence) {
$firstSentence = $sentence;
// break after the first sentence
break;
}
var_dump($firstSentence);
Вывод:
string(164) "A federal agency is recommending that White House adviser Kellyanne Conway be removed from federal service saying she violated the Hatch Act on numerous occasions. "
Дополнительно DOMXpath
позволяет регистрировать функции PHP и вызывать их изВыражение Xpath.Если вам нужна эта логика на уровне Xpath (чтобы использовать их в условиях), это возможно.