Подтвердить что ты не робот

Вытяните первые X слова (не только символы) из mySQL

Я хотел бы иметь возможность вытащить первые X слова из поля базы данных для использования в предварительном просмотре. В основном, если содержимое поля было

 "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris malesuada."

Я хотел бы эхо

 "Lorem ipsum dolor sit amet... see more"

Какой лучший способ сделать это?

Единственное, что я знаю, - это вытащить все поле в запросе, а затем сделать что-то вроде

$foo = [query_results];
$bar = explode(' ', $foo);
for($x=0, $x<6, $x++){
     echo $bar[$x];
};
echo "... see more"

Есть ли лучший подход к этому?

4b9b3361

Ответ 1

Вы определенно хотите использовать SUBSTRING_INDEX, который вернет некоторое количество символов, пока не будет достигнут определенный счет, основанный на появлении разделителя. В вашем случае вызов будет выглядеть так:

 SELECT SUBSTRING_INDEX(text_field, ' ', 6) FROM ...

В частности, это вернет до шести слов , где мы определяем слово как набор символов, которые не являются пробелами, разделенными пробелами.

Примечание: это приведет к препинанию, привязанной к последнему слову, что может быть или не быть желательным. Было бы достаточно просто заменить любые символы пунктуации в хвосте строки в PHP, но если вы хотите полностью остаться в SQL, я думаю, вы можете использовать TRIM. Синтаксис для этого будет примерно таким:

SELECT TRIM(TRAILING ',' FROM SUBSTRING_INDEX(text_field, ' ', 6)) FROM ...

Может быть лучший вариант для удаления завершающей пунктуации - но, возможно, этот еще один вопрос (я все еще ищу лучшее решение, чем TRIM).

Ответ 2

ну, вы можете сделать это в своем запросе, используя функцию подстроки

SELECT CONCATENATE(SUBSTRING(myfield, 0, N), "... see more") FROM mytable

который даст вам первые N букв...

если вы действительно хотите получить первые N слов, и вы определяете слова как "ограниченные пробелами", вы все равно можете сделать это в запросе следующим образом

SELECT CONCATENATE(SUBSTRING_INDEX(myfield," ", N), "... see more") FROM mytable

Ответ 3

Метод 1 (лучше):

Нет, вы также можете использовать подстроку функцию mysql для извлечения нужного текста непосредственно из поля.

Прототип:

SUBSTRING(string,position)

Пример:

SELECT SUBSTRING(field, 25) FROM table

Метод 2:

Вы также можете использовать функцию PHP substr для этой же цели, но сначала вам нужно будет выбрать целое значение поля из db.

$cutted = substr($row['fieldname'], 0, 25) . '.....'; // get 25 chars and append ....

В вашем случае:

$str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris malesuada.";
$parts = explode(" ", $str);
print $parts[0] . ' ' .$parts[1] . ' ' .$parts[2] . ' ' .$parts[3] . ' ' .$parts[4] . '.....See More';

Вывод:

Lorem ipsum dolor sit amet.....See More

Ответ 4

SELECT SUBSTRING(`Filed_Name`,1,X) FROM `Table` where field2 = 0

Вы можете заменить X в выражении подстановки символами, которые вам нужно отобразить.

Ответ 5

Моя философия такова: не делайте эту работу слишком сложной. По моему опыту, MySQL намного быстрее, когда вы кормите его реальным простым запросом, а затем выполняете "настоящую" работу с PHP или любым другим языком, который вы используете. Я не буду следовать ни одному из предложенных предложений - хватайте всю строку, а затем сократите ее с помощью языка сценариев или выбора. Единственное исключение было бы, если бы строка могла быть очень большой - например, 50 КБ или более. В этом случае наличие базы данных сократится, возможно, быстрее. Но действительно, если вы не делаете тысячи этих запросов в секунду (и если вы ошибаетесь, используйте какое-то кеширование), то я не думаю, что есть основания для того, чтобы база данных выполняла эту работу для вы.

Ответ 6

<?php 
    echo "<h3>".$this->consult['page_caption']."</h3>

        ";
    $txt=array();
    $txt = explode(" ",html_entity_decode($this->consult['page_content']));
    $record = array();
    $k =count($txt);

    for($x=0;$x<=30;$x++){
        if(  $x < $k){
            //if($txt
            $record[] = $txt[$x];
        }
    }

    $outdata =implode(" ",$record);
    echo "<p>".$outdata." <a href='#'> more&raquo;</a></p>";
    // html_entity_decode($this->consult['page_content'])
?>

Думаю, это тоже будет полезно. Я использовал его на моей индексной странице, чтобы получить часть содержимого на нем со ссылкой на главную страницу статьи.