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

Проблема с парсингом собственного 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 );

?

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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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

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

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