Регуляркой собрать хеши

Тема в разделе "Как сделать...", создана пользователем komyak, 11 июн 2010.

  1. komyak

    komyak

    Регистр.:
    4 фев 2009
    Сообщения:
    482
    Симпатии:
    183
    Помогите пожалуйста с регуляркой, не пойму как сделать. Паршу список сайтов на наличие хешей, как мне вычленить хеши и имена такого вида:
    Код:
    <p>user:d609ec04c87e253c8538ad342c120b90:IwLS4sYM9NiK1cRWBXW9WpZZPitM3xEW</p>
    <p>user:71ec9d1a7735496e89459dc117593239:oExipLLArM1AUMjBv5DjfhBd6mgg3MUx</p>
    <p>user:d5ac7b77dc4eebe2c710d998508d8a9b</p>
    
    Чтоб на выходе получилось:
    Код:
    user:d609ec04c87e253c8538ad342c120b90:IwLS4sYM9NiK1cRWBXW9WpZZPitM3xEW
    user:71ec9d1a7735496e89459dc117593239:oExipLLArM1AUMjBv5DjfhBd6mgg3MUx
    user:d5ac7b77dc4eebe2c710d998508d8a9b
    
    Хеш всегда между тегами <p>

    Добавлено через 25 минут
    На Ачате помогли, может кому пригодится:
    PHP:
    preg_match_all'|<p>(.+?:[a-f0-9]{32}(?::[a-z0-9]*)?)</p>|i'$result$hash )
     
  2. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    можно еще проще

    PHP:
    preg_match_all'|<p>([^:]+:[^:]+:[^<]+)|i'$result$hash
     
    komyak нравится это.
  3. wal

    wal Постоялец

    Регистр.:
    24 мар 2008
    Сообщения:
    89
    Симпатии:
    30
    это вариант не прокатит для
    <p>user:d5ac7b77dc4eebe2c710d998508d8a9b</p>

    вот так еще проще и все варианты охватывает...
    PHP:
    preg_match_all'|<p>([^<]+)|i'$result$hash
     
  4. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    канешна все. например и такие:

    Код:
    <p>заголовок</p>
    <p>а тута а нас буду хэши</p>
    <p>а вообще говоря формат хэшей у нас предопределен, поэтому маску можно было и не трогать</p>
    <p>user:d609ec04c87e253c8538ad342c120b90:IwLS4sYM9NiK1cRWBXW9WpZZPitM3xEW</p>
    <p>user:71ec9d1a7735496e89459dc117593239:oExipLLArM1AUMjBv5DjfhBd6mgg3MUx</p>
    <p>user:d5ac7b77dc4eebe2c710d998508d8a9b</p>
    
     
  5. wal

    wal Постоялец

    Регистр.:
    24 мар 2008
    Сообщения:
    89
    Симпатии:
    30
    про такие случае никто не уточнял,
    так что язвить не стоит.
     
  6. komyak

    komyak

    Регистр.:
    4 фев 2009
    Сообщения:
    482
    Симпатии:
    183
    wal эта регулярка парсит всё, и текст, и хеши. В итоге в логах куча лишнего мусора.
    Как я понял, оптимально будет собирать хеши двумя регулярками, сначала искать с солью, потом только md5
     
  7. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    лови универсальный вариант:

    PHP:
    <?php
    $st 
    ="<p>user:d609ec04c87e253c8538ad342c120b90:IwLS4sYM9NiK1cRWBXW9WpZZPitM3xEW</p>
    <p>user:71ec9d1a7735496e89459dc117593239:oExipLLArM1AUMjBv5DjfhBd6mgg3MUx</p>
    <p>user:d5ac7b77dc4eebe2c710d998508d8a9b</p>"
    ;

     if (
    preg_match_all'|<p>([^:]+:*[^<]*:*[^<]*)|i'$st$result) )
        for (
    $i=0$i<count($result[1]); $i++)
            print 
    $result[1][$i]."\n";
    ?>
     
  8. komyak

    komyak

    Регистр.:
    4 фев 2009
    Сообщения:
    482
    Симпатии:
    183
    diavolic, твой вариант не подходит. Собирает действительно всё, и хеши, и текст, и теги. Поиск md5(32 символа) нужен полюбому, т.к. противном случае получаю туже кучу мусора.
    name:hashmd5 - обязательные параметры, и они будут и в обычном хеше, и с солью.

    PHP:
    <?php 
    $st 
    ="<p>user:d609ec04c87e253c8538ad342c120b90:IwLS4sYM9NiK1cRWBXW9WpZZPitM3xEW</p> 
    <p>user:71ec9d1a7735496e89459dc117593239:oExipLLArM1AUMjBv5DjfhBd6mgg3MUx</p> 
    <p>user:d5ac7b77dc4eebe2c710d998508d8a9b</p>
    <p>us fgfgfger - d5ac7b7 7dc4eebe2c710  d998fgfgfgf gffgfg508d8a9  </p> <div> bfgfdgz fgfbbvvb  fggfdd dsddss</div>"


     if (
    preg_match_all'|<p>([^:]+:*[^<]*:*[^<]*)|i'$st$result) ) 
        for (
    $i=0$i<count($result[1]); $i++) 
            print 
    $result[1][$i]."\n"
            
        
    //В итоге на выходе пипец...    
    ?>
     
  9. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    komyak, мог бы немного поправить, вроде несложная маска была:

    PHP:
    <?php  
    $st 
    ="<p>user:d609ec04c87e253c8538ad342c120b90:IwLS4sYM9NiK1cRWBXW9WpZZPitM3xEW</p>  
    <p>user:71ec9d1a7735496e89459dc117593239:oExipLLArM1AUMjBv5DjfhBd6mgg3MUx</p>  
    <p>user:d5ac7b77dc4eebe2c710d998508d8a9b</p> 
    <p>us fgfgfger - d5ac7b7 7dc4eebe2c710  d998fgfgfgf gffgfg508d8a9  </p> <div> bfgfdgz fgfbbvvb  fggfdd dsddss</div>"
    ;  

     if (
    preg_match_all'|<p>([^:]+:[^<]*:*[^<]*)|i'$st$result) )  
        for (
    $i=0$i<count($result[1]); $i++)  
            print 
    $result[1][$i]."\n";  
             
        
    //В итоге на выходе все нормально...     
    ?>
     
  10. nagual

    nagual Постоялец

    Регистр.:
    17 фев 2009
    Сообщения:
    65
    Симпатии:
    3
    В хеше точно нет пробелов нужно добавить ^\s и в хеше нет русских букв.