Помогите составить...

Статус
В этой теме нельзя размещать новые ответы.

sashalg

Читатель
Заблокирован
Регистрация
21 Мар 2008
Сообщения
49
Реакции
7
  • Автор темы
  • Заблокирован
  • #1
Вобщем столкнулся с задачей... необходимо создать коррекцию кода:
Пример:
В шаблоне запись:
Код:
<img src='/image.gif' border='0'>
Надо привести в вид:
Код:
<img src='/image.gif' border='0' />

Проблема:
Если именно такая запись, то я могу отследить, но если есть отличия...
Например не
Код:
<img src='/image.gif' border='0'>
, а
Код:
<img src='/image.gif' border='0' />
то у меня получается на выходе
Код:
<img src='/image.gif' border='0' //>

Читал много... Никак не вникну... Прошу на доки меня не посылать... За два дня их начитался.
 
  • Автор темы
  • Заблокирован
  • #2
Есть!!! Я сделал это!!! :yahoo:
Вот! Мож кому пригодится...

PHP:
    function validXHTML($text){
      if($text != ""){
        $ret = preg_replace("#<br\s*/?>#is","<br />",$text);
        $ret = preg_replace("#<hr(.*?)\s*/?>#is","<hr$1 />",$ret);
        $ret = preg_replace("#<img (.*?)\s*/?>#is", "<img $1 />",$ret);
        $ret = preg_replace("#<input (.*?)\s*/?>#is", "<input $1 />",$ret);
        $ret = preg_replace("#<meta (.*?)\s*/?>#is", "<meta $1 />",$ret);
        $ret = preg_replace("#<link (.*?)\s*/?>#is", "<link $1 />",$ret);
        $ret = preg_replace("#<base (.*?)\s*/?>#is", "<base $1 />",$ret);
        return $ret;
      }
    }
 
Как вариант
Код:
preg_replace('#<(?:br|hr|img|input|meta|link|base)\b(?>.*?\K>)(?<!/>)#si', '/>', $text)
 
ага, баг PCRE, которую юзает PHP. Видимо по выходе из (?> ... ) помимо точек возврата удаляется информация о \K.
А в Perl работает.
Чтобы работало в PHP, надо или заменить \K на пару сохраняющих скобок(потеря производительности), или построить регулярку по другой логике.
Например:
Код:
preg_replace('#<(br|hr|img|input|meta|link|base)(?:\s*\b\w+(?:\s*=\s*(?:\'[^\']*\'|"[^"]*"|[^"\'<>\s]+))?)*\s*\K>#si', '/>', $text);
 
  • Автор темы
  • Заблокирован
  • #6
Вот... поигрался на примере RolCom и вот, что получилось:

PHP:
    function validXHTML($text){
        $ret = preg_replace("#<br\s*/?>#is","<br />",$text);
        $ret = preg_replace("#<hr(.*?)\s*/?>#is","<hr$1 />",$ret);
        $ret = preg_replace("#<(img|input|meta|link|base)\s*(.*?)\s*/?>#is","<$1 $2 />",$ret);
        return $ret;
    }

проще пока не получается...
 
Если у тебя XHTML, то:
Код:
preg_replace('#<(?:br|hr|img|input|meta|link|base).*?\K/?>#si', '/>', $text);
Если HTML лучше воспользоваться предыдущим вариантом.
 
  • Автор темы
  • Заблокирован
  • #8
Так... объясню для чего такие весчи мне.
При использование шаблонов xhtml сайта и контента с html тегами.
шаблон написан на xhtml, а пользователь может быть и не в курсе о правилах xhtml и я как автор CMS должен предусмотреть коррекцию кода дабы не напрягать пользователя.

Вот.
 
ИМХО бестолковое занятие. Во первых, толк сомнительный. Во вторых если отдавать как реальный XHTML ошибки все равно трудно избежать, а если отдавать с content-type HTML браузер поймет и так, да толку совсем 0, т.к. это не XHTML будет.
Если все же делать то просто слеши у тегов расставить мало, надо еще необязательные теги и теги с необязательным закрывающим тегом расставить, формат значений атрибутов привести в XML-ный, и д.р. Лучше поискать готовое решение на эту тему.

Ругулярка же подойдет которая в посте №5. Т.к. HTML допускает например такую запись <img src="next.gif" alt="->">. Остальные варианты здесь с ней не справятся.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху