Перейти к контенту

Проблема с парсингом собственного BBCode


Рекомендуемые сообщения

Модифицировал парсер форума, дабы он понимал мой тег [song]ID[/song], который вставляет флеш-плеер с загруженной песней с этим ID. Откуда чего и как грузит флешплеер - отношения к делу вроде бы не имеет. Итак, вот что у меня получилось.

 

Сперва заменяем тег на HTML код при отправке поста:

 

$txt = preg_replace( "#\[song\]([0-9]*)\[/song\]#ise", "'<div style=\"font-size: 10px; font-weight: bold;\">Для воспроизведения требуется Adobe Flash Player.</div><object type=\"application/x-shockwave-flash\" width=\"460\" height=\"16\" data=\"http://music.netultima.trc.local/modules/flash/xspf_jukebox.swf?autoplay=false&repeat_playlist=false&crossFade=false&shuffle=false&skin_url=http://music.netultima.trc.local/modules/flash/slim_gray/&playlist_url=http://music.netultima.trc.local/play/play-'.doEncrypt('\\1').'\"><param name=\"movie\" value=\"http://music.netultima.trc.local/modules/flash/xspf_jukebox.swf?repeat_playlist=false&crossFade=false&shuffle=false&skin_url=http://music.netultima.trc.local/modules/flash/slim_gray/&playlist_url=http://music.netultima.trc.local/play/play-'.doEncrypt('\\1').'\" /></object>'", $txt );

 

Теперь заменяем HTML код в БД обратно на теги при редактировании поста:

 

$txt = preg_replace( "#<div style=\"font-size: 10px; font-weight: bold;\">Для воспроизведения требуется Adobe Flash Player.</div><object type=\"application/x-shockwave-flash\" width=\"460\" height=\"16\" data=\"http://music.netultima.trc.local/modules/flash/xspf_jukebox.swf\?autoplay=false&repeat_playlist=false&crossFade=false&shuffle=false&skin_url=http://music.netultima.trc.local/modules/flash/slim_gray/&playlist_url=http://music.netultima.trc.local/play/play-(.*)\"><param name=\"movie\" value=\"http://music.netultima.trc.local/modules/flash/xspf_jukebox.swf\?repeat_playlist=false&crossFade=false&shuffle=false&skin_url=http://music.netultima.trc.local/modules/flash/slim_gray/&playlist_url=http://music.netultima.trc.local/play/play-(.*)\" /></object>#ise", "'[song]'. doDecryptFullHash('\\1').'[/song]'", $txt );

 

 

Все работает замечательно, если в посте присутствует только один тег [song]. Если же их несколько, то при попытке отредактировать наблюдаем только один тег, ссылающийся на нулевой ID, т.е. в посте остается только [song]0[/song], остальные теги [song] пропадают. Содержимое поста при этом не страдает, только содержимое тегов [song]. В чем может быть косяк?

Ссылка на комментарий
Поделиться на других сайтах

Странно, что остальные не страдают, но я бы в первую очередь попробывал в пре_едит использовать не ., а также [0-9], и поставить в обоих случаях ограничение на жадность: ([0-9]*?).
Ссылка на комментарий
Поделиться на других сайтах

Перво-наперво непонятно зачем использовал в регвыре модификатор e.
Ссылка на комментарий
Поделиться на других сайтах

To Song: там используется PHP-функция:

 

"'[song]'. doDecryptFullHash('\\1').'[/song]'", $txt );

 

Я так понял из манов, "e" нужен для того, чтобы выполнять код.

 

To Sannis: не совсем понял, о чем речь, к сожалению. Я так понимаю, проблема в обратном преобразовании HTML в тег?

Кстати, во втором случае использовать 0-9 не получится, потому как от цифор там не остается ничего. См. ниже пример кода.

 

PS: Проверил, HTML код генерируется абсолютно нормально и при вставке нескольких тегов, два фрагмента кода ничем не отличаются друг от друга. Если это может пригодиться, генерируется код такого вида:

 

<object type="application/x-shockwave-flash" width="460" height="16" data="http://music.netultima.trc.local/modules/flash/xspf_jukebox.swf?autoplay=false&repeat_playlist=false&crossFade=false&shuffle=false&skin_url=http://music.netultima.trc.local/modules/flash/slim_gray/&playlist_url=http://music.netultima.trc.local/play/play-be046eb1cd3b1449-217f-46ec73749e5b81dd"><param name="movie" value="http://music.netultima.trc.local/modules/flash/xspf_jukebox.swf?repeat_playlist=false&crossFade=false&shuffle=false&skin_url=http://music.netultima.trc.local/modules/flash/slim_gray/&playlist_url=http://music.netultima.trc.local/play/play-be046eb1cd3b1449-217f-46ec73749e5b81dd" /></object>

 

 

(да простит меня форум за очередной горизонтальный скролл)

 

Add: есть прогресс. Если во втором случае заменить (.*) на (.+?) - один из тегов остается в живых и ID в нем верный, а второй тег все равно кушается.

Ссылка на комментарий
Поделиться на других сайтах

$txt = preg_replace( "#<div style=\"font-size: 10px; font-weight: bold;\">Для воспроизведения требуется Adobe Flash Player.</div><object type=\"application/x-shockwave-flash\" width=\"460\" height=\"16\" data=\"http://music.netultima.trc.local/modules/flash/xspf_jukebox.swf\?autoplay=false&repeat_playlist=false&crossFade=false&shuffle=false&skin_url=http://music.netultima.trc.local/modules/flash/slim_gray/&playlist_url=http://music.netultima.trc.local/play/play-(.+?)\"><param name=\"movie\" value=\"http://music.netultima.trc.local/modules/flash/xspf_jukebox.swf\?repeat_playlist=false&crossFade=false&shuffle=false&skin_url=http://music.netultima.trc.local/modules/flash/slim_gray/&playlist_url=http://music.netultima.trc.local/play/play-\\1\" /></object>#ise", "'[song]'. doDecryptFullHash('\\1').'[/song]'", $txt );

?

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.