Как отформатировать первое слово / символ из поля html -разметка MySQL? - PullRequest
3 голосов
/ 15 февраля 2020

Я сделал следующее, что работает с простыми текстовыми полями:

$field = "How are you doing?";
$arr = explode(' ',trim($field));
$first_word = $arr[0];
$balance = strstr("$field"," ");

Это не сработало, потому что поле содержит html разметку, возможно изображение, видео, div, div, абзац и т. Д. c и приводил к тому, что весь текст в html смешивался с текстом.

Я мог бы использовать strip_tags, чтобы вырезать html, затем получить первое слово и переформатировать его, но тогда я бы нужно выяснить, как добавить html обратно в данные. Мне интересно, есть ли php или пользовательская функция, готовая для этой цели.

1 Ответ

0 голосов
/ 15 февраля 2020

Вы можете использовать DOMDocument для анализа HTML, изменения содержимого и сохранения его как HTML. Кроме того, найти слова не всегда так же просто, как использовать разделители пробелов, поскольку не все языки разделяют свои слова пробелами и не все слова обязательно разделяются пробелами. Например: mother-in-law это можно рассматривать как одно слово или как 3 в зависимости от того, как вы определяете слово . Кроме того, такие вещи, как блин считаете ли вы это одним словом или двумя ( пан и торт )? Одним из простых решений является использование класса IntlBreakIterator::createWordInstance, который реализует стандарт Unicode для сегментации текста AKA UAX # 29 .

Вот пример того, как вы могли бы go реализовать это:

$html = <<<'HTML'
<div>some sample text here</div>
HTML;

/* Let's extend DOMDocument to include a walk method that can traverse the entire DOM tree */
class MyDOMDocument extends DOMDocument {
    public function walk(DOMNode $node, $skipParent = false) {
        if (!$skipParent) {
            yield $node;
        }
        if ($node->hasChildNodes()) {
            foreach ($node->childNodes as $n) {
                yield from $this->walk($n);
            }
        }
    }
}

$dom = new MyDOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

// Let's traverse the DOMTree to find the first text node
foreach ($dom->walk($dom->childNodes->item(0)) as $node) {
    if ($node->nodeName === "#text") {
        break;
    }
}

// Extract the first word from that text node
$iterator = IntlBreakIterator::createWordInstance();
$iterator->setText($node->nodeValue); // set the text in the word iterator
$it = $iterator->getPartsIterator(IntlPartsIterator::KEY_RIGHT);
foreach ($it as $offset => $word) {
    break;
}

// You can do whatever you want to $word here
$word .= "s"; // I'm going to append the letter s

// Replace the text node with the modification
$unmodifiedString = substr($node->nodeValue, $offset);
$modifiedString = $word . $unmodifiedString;
$oldNode = $node; // Keep a copy of the old node for reference
$node->nodeValue = $modifiedString;

// Replace the node back into the DOM tree
$node->parentNode->replaceChild($node, $oldNode);

// Save the HTML
$newHTML = $dom->saveHTML();

echo $newHTML;

Выходы

<div>somes sample text here</div>
...