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

Тема в разделе "Регулярные выражения", создана пользователем sashalg, 6 апр 2009.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. sashalg

    sashalg Читатель

    Заблокирован
    Регистр.:
    21 мар 2008
    Сообщения:
    49
    Симпатии:
    7
    Вобщем столкнулся с задачей... необходимо создать коррекцию кода:
    Пример:
    В шаблоне запись:
    Код:
    <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. sashalg

    sashalg Читатель

    Заблокирован
    Регистр.:
    21 мар 2008
    Сообщения:
    49
    Симпатии:
    7
    Есть!!! Я сделал это!!! :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;
          }
        }
     
  3. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Как вариант
    Код:
    preg_replace('#<(?:br|hr|img|input|meta|link|base)\b(?>.*?\K>)(?<!/>)#si', '/>', $text)
    
     
  4. sashalg

    sashalg Читатель

    Заблокирован
    Регистр.:
    21 мар 2008
    Сообщения:
    49
    Симпатии:
    7
    Не работает... :-]
     
  5. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    ага, баг 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. sashalg

    sashalg Читатель

    Заблокирован
    Регистр.:
    21 мар 2008
    Сообщения:
    49
    Симпатии:
    7
    Вот... поигрался на примере 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;
        }
    проще пока не получается...
     
  7. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Если у тебя XHTML, то:
    Код:
    preg_replace('#<(?:br|hr|img|input|meta|link|base).*?\K/?>#si', '/>', $text);
    
    Если HTML лучше воспользоваться предыдущим вариантом.
     
  8. sashalg

    sashalg Читатель

    Заблокирован
    Регистр.:
    21 мар 2008
    Сообщения:
    49
    Симпатии:
    7
    Так... объясню для чего такие весчи мне.
    При использование шаблонов xhtml сайта и контента с html тегами.
    шаблон написан на xhtml, а пользователь может быть и не в курсе о правилах xhtml и я как автор CMS должен предусмотреть коррекцию кода дабы не напрягать пользователя.

    Вот.
     
  9. RolCom

    RolCom

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

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