2010-02-20 2 views
12

Я хотел бы иметь возможность вытаскивать первые X слова из поля базы данных для использования в предварительном просмотре. В принципе, если поле «s содержание былоВытащить первые X слова (не только символы) из mySQL

"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" 

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

+1

Предполагалось, что всегда есть как минимум шесть слов? –

+0

Ну, это время для времени. Да, это решение предполагает всегда 6 слов. Я бы, очевидно, поставил более хороший код, чтобы учесть возможность меньше. –

ответ

14

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

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

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

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

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

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

+0

Отмечая вас как ответ, отвечая на него и объясняя, почему это ответ. Благодаря тонну! –

0

Метод 1 (Better):

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

Прототип

SUBSTRING(string,position) 

Пример:

SELECT SUBSTRING(field, 25) FROM table 

Метод 2:

Вы также можете использовать substr функции PHP для тех же целей, но сначала вы будете нужно выбрать wh Значение поля ole от 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 
+0

OP запросил решение, которое учитывает и ограничивает слова (на основе пространственного разграничения) * не * символов! –

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

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

+0

кроме OP необходимо отображать * слова * не символы ... –

5

хорошо вы могли бы сделать это в запросе с помощью функции подстроки

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

, что поможет вам первые N букв ...

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

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

Это CONCATENATE или CONCAT? Для меня все работает, если я использую CONCAT, но не CONCATENATE. Я использую MySql. – Norman

0

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

0
<?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']) 
?> 

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

Смежные вопросы