Доработать регулярку. Парсинг

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

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

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    Есть текст такой
    HTML:
    
    <a target="_blank" href= 
    "/someplace/121354-pathname.html"> 
      <div style="display: inline!important;">«Наши слоны самые слонистые слоны»
      </div> 
    </ a >
    
    Надо сделать выборку всего что находится между <a href...> и </a> при условии что между ними:
    1. есть только заданые теги (например div,span,font)
    2. нет заданых тегов (допустим table,img)
    Доработайте плиз кто-то, никак не могу.:confused:
    Код:
    #<a\b[^>]*href\s*=\s*([\"\'])([[:alnum:]-/\.]*)\1[^>]*>
    (.*)
    <\s*/\s*a\s*>#sxiu
    
     
  2. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Текст, в котором
    Код:
    1) (?:</?(?:b|i)\b[^>]*>|[^<>])*
    2) (?:</?(?!(?:i|b))[a-z_][^>]*>|[^<>])*
    
    А вообще div, table не может быть в ссылке.
     
    antidote нравится это.
  3. roddik

    roddik Колбаска

    Регистр.:
    26 янв 2007
    Сообщения:
    351
    Симпатии:
    285
    А достать анкор и потом проверить средствами языка содержимое образование не позволяет? Регулярные выражения - это не круто, особенно когда через 2 дня сам хрен поймешь что оно делает
     
  4. antidote

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    Ух-ты, но я парсю такой код.
    HTML:
    
    <a href="URL"><div style="display:block;">Текст</div></a>
    
    Да и вопрос заключается для понимания самого принципа, а не тупой вставки в код. Все еще будет усложняться и переделываться.


    Позволяет, даже очень. Но зачем делать такое, если все равно уже регексп использую. ИМХО не логично.

    UPD:
    Эммм, наверно чуть не так выразился. Можно ли сделать так, чтоб эти условия были прямо в той же регулярке??
    Код:
    #<a\b[^>]*href\s*=\s*([\"\'])([[:alnum:]-/\.]*)\1[^>]*>
    (.*)
    <\s*/\s*a\s*>#sxiu
    
    т.е. там где сейчас стоит (.*) должно проверяться условие что между тегами <a ..>..</a> гарантировано нет <img или <div. Возможна вложеность тегов. Далее я смотрю на длину 3-го (вроде правильно посчитал) совпадения, и ежели она не нулевая решаю что делать.
     
  5. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Порочти стандарт, не любой тег может размещатся в любом, а даже наоборот, есть правила размещения тегов. А такое написание, особенно без каких-то исключительных причин, чревато только ошибками.


    Особенно когда изначально не знаешь:)
     
  6. roddik

    roddik Колбаска

    Регистр.:
    26 янв 2007
    Сообщения:
    351
    Симпатии:
    285
    Ну да, дали вот регулярки прямо из коробки и каждый уважающий себя быдлокодер пытается ними делать все, что связано со строками, и вот хер кто знает про domdocument и xpath
     
  7. antn

    antn Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    104
    Симпатии:
    30
    Да, можно, если очень сильно хочется. Но решение кривое и не всегда сможет корректно работаеть, т.к. не может учитывать все особенности синтаксиса.
    Код:
    #<a\b[^>]*href\s*=\s*([\"\'])([[:alnum:]-/\.]*)\1[^>]*>
    ((?:.(?!<img|<div))*)
    <\s*/\s*a\s*>#sxiu
    Если нужно проверять вложенность, уровни вложенности и т.п., здесь регулярки безсильны вообще, куда проще написать конечный автомат для разбора.
     
    antidote нравится это.
Статус темы:
Закрыта.