Вытащить текст

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

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

    Dador Читатель

    Заблокирован
    Регистр.:
    14 янв 2008
    Сообщения:
    368
    Симпатии:
    97
    Есть варианты name, id --- из вариантов тегов, которые тоже в массиве, также есть массив с возможными названиями

    Нужно найти то что между <$tag $idname=$name ...> ... </$tag>
    где ... любой текст
    а:
    $tag равен div или span
    $idname равен id или name или class
    $name равен массиву с именами к прмиеру $name=array('test-id-', 'post-id-');


    Прошу помочь..., Заранее Спасибо!

    p.s. с меня спасибки вам за помощь
     
  2. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Массив name большой? Между <$tag $idname=$name ...> ... </$tag> именно текст, или могут быть теги div/span? Если да то могут ли там быть сами искомые, вложенные <$tag $idname=$name ...> ... </$tag>? Ну, и язык какой?
    Пока вот так:
    Код:
    {
    <(div|span)\b
    (?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'>"]+))?)*?
    (?>\s*(?:id|name|class)\s*=\s*
       (?:(")|('))?+
           (?:n1|n2|n3|n4) #параметры
       (?(3)')(?(2)")
    )
    (?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'>"]+))?)*>
    (.*?)
    </\1\s*>
    }xis
    
     
    Dador нравится это.
  3. Dador

    Dador Читатель

    Заблокирован
    Регистр.:
    14 янв 2008
    Сообщения:
    368
    Симпатии:
    97
    теги могут быть, текст русский но возможны и англ. вставки ну названия к примеру)
    а теги сами искомые не могут быть, т.к. это к примеру новосной сайт и у него такая арх.:
    Код:
    <div name=content>
    
    <div name=news-id-1>
    
    <div aglin=center><b>Привет!</b><br> Наш сайт открыт!</div><br>Мы очень хотим чтобы вы посещали его <img scr=/imgs/smile/d.gif alt=D>
    
    </div>
    
    <div name=news-id-2>...</div>
    
    <div name=news-id-3>...</div>
    
    <div name=news-id-4>...</div>
    
    <div name=news-id-5>...</div>
    
    </div>
    
     
  4. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Вообще-то имелся ввиду язык программированния:)
    Вот, будет работать в Perl 5.10 и PHP большинства версий.
    Код:
    {
    <(div|span)\b
    (?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*?
    (?>\s*(?:id|name|class)\s*=\s*
       (?>(?:(")|('))?+
           (?>a1|a2|a3)
       (?(2)"|(?(3)'|(?=[>\s]))) )
    )
    (?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*+>
     (  #содержание- 4-ые скобки
        (?:
            [^<]++|
            <(div|span)\b
                (?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*+>
            (?4)</\5\s*>|
            .
        )*?
     )
    </\1\s*>
     }xis;
    
     
    Dador нравится это.
  5. Dador

    Dador Читатель

    Заблокирован
    Регистр.:
    14 янв 2008
    Сообщения:
    368
    Симпатии:
    97
    php, спасибо, пробую

    и теперь такой вопрос, как же его впихнуть в preg_match_all или хотябы в preg_match, когда пробую без кавычек - синтасическая ошибка, с ними (любыми) = тоже
    как его вставить?
     
  6. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Потому что внутри есть кавычки обоих видов. Следовательно, кавчки того вида, в которые заключена регулярка, надо экранировать, либо использовать синтаксис heredoc (если PHP 5.3 то можно nowdoc).
    В случае двойных кавычек или heredoc здесь надо также экранировать слеши в обратных ссылках.
    Пример с heredoc:
    PHP:
    $names=join('|'$names);
    $re=<<<EOF
    {
    <(div|span)\b
    (?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*?
    (?>\s*(?:id|name|class)\s*=\s*
       (?>(?:(")|('))?+
           (?>
    $names)
       (?(2)"|(?(3)'|(?=[>\s]))) )
    )
    (?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*+>
     (  #содержание- 4-ые скобки
        (?:
            [^<]++|
            <(div|span)\b
                (?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*+>
            (?4)</\\5\s*>|
            .
        )*?
     )
    </\\1\s*>
    }xis
    EOF;
    preg_match_all($re$text$m);
     
    Dador нравится это.
  7. gelous

    gelous

    Регистр.:
    11 май 2007
    Сообщения:
    215
    Симпатии:
    11
    можно ли модифицировать это выражение, чтобы оно не обрывалось на первом найденом </div|span|и т.д.>, а сколько открыто - столько и закрыто.

    Регэскп ооч хороший, но ооч сложный =(
     
  8. Dador

    Dador Читатель

    Заблокирован
    Регистр.:
    14 янв 2008
    Сообщения:
    368
    Симпатии:
    97
    да хотелось бы, только я его не знаю (RegExp)... Вытаскивать текст можно тогда будет автоматически, т.е. спарсил гуглю, взял текст, уникальным сделал, и делай что хочешь
     
  9. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Всмысле? Если речь о вложенности div/span тегов внутри искомого div/span, то оно и так их учитыват.
    Приведи пример текста, где регулярка не работает, как хотелось бы.
     
    Dador нравится это.
Статус темы:
Закрыта.