[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вытащить из базы заголовок H1
Sergen
Доброго времени суток!
Подскажите пожалуйста, в чем ошибка?
Пытаюсь вытащить из базы заголовки h1 (они хранятся в виде-<h1> текст</h1>)
Пытался через...WHERE `rows` LIKE '%\</h1\>'
И так: WHERE `rows` LIKE '%\<\/h1\>'
И вообще без обратных слешей, ничего не ищется. Ошибок то же не выдается(В смысле если перемудрить вылезит конечно.)
Пробовал через RLIKE, чего-то то же никак.
По ходу пьесы узнал про такую класную штуку: REGEXP, но она то же не катит...



Спустя 10 минут, 4 секунды (24.01.2012 - 18:45) dadli написал(а):
WHERE `rows` LIKE '%<H1>%'

Спустя 5 минут, 18 секунд (24.01.2012 - 18:50) Sergen написал(а):
Цитата (dadli @ 24.01.2012 - 15:45)
WHERE `rows` LIKE '%<H1>%'

Неа, не работает. Точнее работает но вытаскивает весь текст, включая и h1. А мне нужно только h1.

Спустя 4 минуты, 12 секунд (24.01.2012 - 18:54) dadli написал(а):
Sergen
то ест вам есть : "блабла <h1>текст</h1> еше бла бла"
и хотите виташит из него толко "текст"
ето так?

Спустя 9 секунд (24.01.2012 - 18:55) alexbel2404 написал(а):
Цитата (Sergen @ 24.01.2012 - 19:50)
Цитата (dadli @ 24.01.2012 - 15:45)
WHERE `rows` LIKE '%<H1>%'

Неа, не работает. Точнее работает но вытаскивает весь текст, включая и h1. А мне нужно только h1.

не понятно, что нужно тогда

Спустя 14 часов, 52 минуты, 8 секунд (25.01.2012 - 09:47) Sergen написал(а):
Цитата
не понятно, что нужно тогда

Нужно вытащить <h1>текст</h1> из текста. А сам текст включая этот заголовок хранится в одной ячейке в базе.


Спустя 37 минут, 48 секунд (25.01.2012 - 10:24) asokol написал(а):
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html
RLIKE - синоним REGEXP.

Вам понадобятся LOCATE, SUBSTRING.

Спустя 13 часов, 19 секунд (25.01.2012 - 23:25) Sergen написал(а):
Цитата (asokol @ 25.01.2012 - 07:24)
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html
RLIKE - синоним REGEXP.

Вам понадобятся LOCATE, SUBSTRING.

LOCATE не подойдет точно, так как возвращает позицию, SUBSTRING то же, поскольку связан то же с позициями

Спустя 22 часа, 26 минут, 33 секунды (26.01.2012 - 21:51) Sergen написал(а):
Решил эту проблему, работает, но она мне нифига не нравится.
Вытаскиваю весь текст и из него с помощью регулярки вытаскиваю заголовок

$h1 = eregi("<h1>(.*)</h1>",$rows[rows],$regs);

Спустя 20 минут, 35 секунд (26.01.2012 - 22:12) neadekvat написал(а):
Sergen, во-первых, это устаревший варинат. К тому же, некорректный. Во-вторых, тебе уже сказали про функции mysql, с помощью которых можно найти позицию <h1> и </h1>, а также обрезать текст по позиции.

Спустя 28 минут, 3 секунды (26.01.2012 - 22:40) Sergen написал(а):
Цитата (neadekvat @ 26.01.2012 - 19:12)
Sergen, во-первых, это устаревший варинат. К тому же, некорректный. Во-вторых, тебе уже сказали про функции mysql, с помощью которых можно найти позицию <h1> и </h1>, а также обрезать текст по позиции.

neadekvat, Почему устаревший? Почему некорректный? Вырезает именно заголовок h1.
Что касается средств mysql. Я понял так.Вычислить позицию первого <h1>, потом </h1> или я чего-то недогоняю?

Спустя 28 минут, 3 секунды (26.01.2012 - 23:08) neadekvat написал(а):
Цитата (Sergen @ 26.01.2012 - 23:40)
Почему устаревший?

Потому что функция eregi помечена "DEPRECATED" и, скорее всего, будет удалена.

Цитата (Sergen @ 26.01.2012 - 23:40)
Почему некорректный?

Потому что не инвертирована жадность. В тексте
Цитата
<h1>asd</h1> asd <h1>asd</h1>

регулярное выражение возьмет
Цитата
asd</h1> asd <h1>asd

Стоит же инвертировать жадность:
<h1>(.*?)</h1>

И все будет ок.
Цитата (Sergen @ 26.01.2012 - 23:40)
Я понял так.Вычислить позицию первого <h1>, потом </h1> или я чего-то недогоняю?

Да, а потом обрезать от позиции первого до позиции второго - будет заголовок.

Спустя 20 минут, 40 секунд (26.01.2012 - 23:29) vital написал(а):
Я бы начал с того, что нельзя хранить данные и делать выборки так, как делает тс.

Спустя 4 минуты, 54 секунды (26.01.2012 - 23:34) neadekvat написал(а):
vital, запарилось уже про нормализацию втирать.

Спустя 1 минута, 39 секунд (26.01.2012 - 23:35) inpost написал(а):
Sergen
Ты задал вопрос: "как решить через задницу", и ждёшь помощи. Хотя лучше было бы рассказать, что тебе надо в целом, зачем такую вещь в БД хранить? Зачем её вообще парсить и разбивать на части?

Спустя 12 минут, 24 секунды (26.01.2012 - 23:48) Sergen написал(а):
Цитата (vital @ 26.01.2012 - 20:29)
Я бы начал с того, что нельзя хранить данные и делать выборки так, как делает тс.

В Джумле именно так хранится. Переделать весь джумловский код?

Спустя 2 минуты, 43 секунды (26.01.2012 - 23:50) neadekvat написал(а):
Цитата (Sergen @ 27.01.2012 - 00:48)
В Джумле именно так хранится. Переделать весь джумловский код?

Будем спорить или решать проблему? Тебе понятен мой ответ?

Спустя 5 минут, 6 секунд (26.01.2012 - 23:55) inpost написал(а):
Sergen
Может ты говоришь не про Джумлу, а про подключенные к ней модули СТОРОННИХ КРИВОРУКИХ РАЗРАБОТЧИКОВ? smile.gif

Спустя 1 минута, 57 секунд (26.01.2012 - 23:57) Sergen написал(а):
Цитата
Да, а потом обрезать от позиции первого до позиции второго - будет заголовок.

Насколько я понял, в одном запросе это не сделать

Спустя 3 минуты, 44 секунды (27.01.2012 - 00:01) Sergen написал(а):
Цитата (inpost @ 26.01.2012 - 20:55)
Sergen
Может ты говоришь не про Джумлу, а про подключенные к ней модули СТОРОННИХ КРИВОРУКИХ РАЗРАБОТЧИКОВ? smile.gif

Вообще-то про стандартный джумловский набор. Мне казалось что текст статьи должен хранится вместе с заголовками, коих может быть несколько (Джумла это или не джумла, без разницы) Или нет?

Спустя 2 минуты (27.01.2012 - 00:03) inpost написал(а):
В таком случае нет смысла парсить. Есть блок, он весь в textarea загоняется. Другой блок в другой textarea.

Спустя 3 минуты, 31 секунда (27.01.2012 - 00:07) Sergen написал(а):
Цитата (inpost @ 26.01.2012 - 21:03)
В таком случае нет смысла парсить. Есть блок, он весь в textarea загоняется. Другой блок в другой textarea.

В смысле блок? Статью разбить на блоки?

Спустя 7 минут, 5 секунд (27.01.2012 - 00:14) neadekvat написал(а):
Цитата (Sergen @ 27.01.2012 - 01:01)
Вообще-то про стандартный джумловский набор. Мне казалось что текст статьи должен хранится вместе с заголовками, коих может быть несколько (Джумла это или не джумла, без разницы) Или нет?

Если заголовок у статьи один - то в отдельном столбце.

Цитата (Sergen @ 27.01.2012 - 00:57)
Насколько я понял, в одном запросе это не сделать

Неправильно понял.
SELECT SUBSTR(`col`, LOCATE('<h1>', `col`) + 4, LOCATE('</h1>', `col`)) FROM `tbl` WHERE `col` LIKE '%<h1>%'

Примерно так.

Спустя 30 минут, 55 секунд (27.01.2012 - 00:45) killer8080 написал(а):
Цитата (neadekvat @ 26.01.2012 - 23:14)
Неправильно понял.
SELECT SUBSTR(`col`, LOCATE('<h1>', `col`) + 4, LOCATE('</h1>', `col`)) FROM `tbl` WHERE `col` LIKE '%<h1>%'

Примерно так.

Не прокатит, третий аргумент SUBSTRING() длина, а не позиция.

Спустя 1 минута, 58 секунд (27.01.2012 - 00:47) neadekvat написал(а):
Цитата (killer8080 @ 27.01.2012 - 01:45)
Не прокатит, третий аргумент SUBSTRING() длина, а не позиция.

Пардон, не подумал.
Тогда как-то так:
SELECT SUBSTR(`col`, (LOCATE('<h1>', `col`) + 4), (LOCATE('</h1>', `col`) - (LOCATE('<h1>', `col`) + 4)))
FROM `tbl` WHERE `col` LIKE '%<h1>%'

Спустя 2 минуты, 34 секунды (27.01.2012 - 00:49) killer8080 написал(а):
нет, правильней так
SELECT 
SUBSTR(
`content`,
LOCATE('<h1>', `content`) + 4,
LOCATE('</h1>', `content`) - LOCATE('<h1>', `content`) - 4
) AS `str`
FROM `test`
WHERE `content` LIKE '%<h1>%'

Спустя 3 минуты, 52 секунды (27.01.2012 - 00:53) neadekvat написал(а):
killer8080, принципиальное отличие, кроме раскрытых скобок?

Спустя 2 минуты, 27 секунд (27.01.2012 - 00:55) killer8080 написал(а):
neadekvat
-4, а не +4
Иначе вернет огрызок тега </h1

Спустя 2 минуты, 29 секунд (27.01.2012 - 00:58) neadekvat написал(а):
Цитата (killer8080 @ 27.01.2012 - 01:55)

-4, а не +4
Иначе вернет огрызок тега </h1

А, это фигня. Я никогда считать не умел. Попробую - узнаю, куда смещать указатель надо.
Хоть какая-то бы работа автору досталась.

Спустя 7 минут, 32 секунды (27.01.2012 - 01:06) killer8080 написал(а):
Цитата (neadekvat @ 26.01.2012 - 23:58)
А, это фигня. Я никогда считать не умел.

Я то же smile.gif
LOCATE('</h1>', `content`) - LOCATE('<h1>', `content`) даст длину текста заголовка, плюс длина начального тега, еще плюс 4, и того 8 лишних символов. Т.е. вернет закрывающий тег и 3 последующих символа, так что насчет огрызка я то же был не прав smile.gif

Спустя 2 минуты, 47 секунд (27.01.2012 - 01:08) neadekvat написал(а):
Цитата (killer8080 @ 27.01.2012 - 02:06)
даст длину текста заголовка, плюс длина начального тега, еще плюс 4, и того 8 лишних символов. Т.е. вернет закрывающий тег и 3 последующих символа, так что насчет огрызка я то же был не прав

Я неимоверно рад, что мне не пошел в хирурги или, того хуже, кардиологи. Где одна попытка.
Проще запустить - и посмотреть. Не вижу смысла забивать себе голову лишними переменными, тем более, что доп. запуск и исправление запроса получится реально быстрее, чем высчитывать, в какой точке будет находится указатель) К тому же, ты прекрасно знаешь, все эти функции работы со стороками порой возвращают неожиданный результат...

Спустя 7 часов, 13 минут, 12 секунд (27.01.2012 - 08:21) Sergen написал(а):
Принцип понял, только вот выходит ошибка.
Я пробовал вот так:

$result_h1 = mysql_query("SELECT SUBSTRING(`text`, (LOCATE('<h1>', `text`))+4,((LOCATE('</h1>', `text`)-5)-(LOCATE('<h1>', `text`) + 4) ) )
FROM `content` WHERE`id` = '"
.$id."'");


Спустя 1 час, 7 минут, 50 секунд (27.01.2012 - 09:29) killer8080 написал(а):
Цитата (Sergen @ 27.01.2012 - 07:21)
только вот выходит ошибка.

И что? Нам её угадывать? Или ctrl+c, ctrl+v не работает?

Спустя 8 часов, 40 минут, 18 секунд (27.01.2012 - 18:10) Sergen написал(а):
Цитата (killer8080 @ 27.01.2012 - 06:29)
Цитата (Sergen @ 27.01.2012 - 07:21)
только вот выходит ошибка.

И что? Нам её угадывать? Или ctrl+c, ctrl+v не работает?

Да блин, я утром перед работой быстро набросал, поэтому не все изложил. Сейчас посмотрел, ошибки нет. Поковыряюсь вечером, обязательно отпишу


Спустя 21 час, 56 минут, 52 секунды (28.01.2012 - 16:06) Sergen написал(а):
Если выводить $rows = mysql_fetch_assoc($result);
И дальше echo"$rows[text]": то ничего не выводится
Если просто print_r($rows);
То выводится
Array ( [SUBSTRING(`introtext`, ((LOCATE('
'
, `introtext`))+4),((LOCATE('
'
, `introtext`)+4)-(LOCATE('
'
, `introtext`) + 4) ) )] => Здесь текст заголовка


Не пойму, нужно загонять в строку и через регулярку выводить текст?

Спустя 9 минут, 47 секунд (28.01.2012 - 16:16) neadekvat написал(а):
Дополни запрос:
SELECT SUBSTRING(...) as introtext

Тогда можно будет вывести так:
echo $rows['introtext'];

Спустя 35 минут, 24 секунды (28.01.2012 - 16:52) Sergen написал(а):
Цитата (neadekvat @ 28.01.2012 - 13:16)
Дополни запрос:
SELECT SUBSTRING(...) as introtext

Тогда можно будет вывести так:
echo $rows['introtext'];

Спасибо огромное работает!

Спустя 5 часов, 12 минут, 41 секунда (28.01.2012 - 22:04) Sergen написал(а):
Кстати, я тут решил поизвращаться дальше...А что если вытащить другие заголовки или текст в других тегах, например <ем>?

Спустя 2 часа, 24 секунды (29.01.2012 - 00:05) neadekvat написал(а):
Очевидно, надо сменить h1 на em.

Спустя 10 часов, 17 минут, 22 секунды (29.01.2012 - 10:22) Sergen написал(а):
Цитата (neadekvat @ 28.01.2012 - 21:05)
Очевидно, надо сменить h1 на em.

Да не, помимо h1 еще em например...Вчера пробовал, фигня. Где-то прочитал что лучше подойдет в этом случае SUBSTRING_INDEX. Сегодня поэксперементирую

Спустя 27 минут, 37 секунд (29.01.2012 - 10:50) Sergen написал(а):
Подскажите пожалуйста, а в запросе можно присваивать найденные строки переменным?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.