Регулярка (прошу помощи)

Discussion in 'PHP' started by Vald, 23 Apr 2015.

  1. Vald

    Vald Member

    Joined:
    6 Aug 2009
    Messages:
    25
    Likes Received:
    16
    Reputations:
    0
    Регулярки для меня пока сложновато(
    Пытаюсь составить для отсеивания линков, которые можно проверить на простую sql-инъекцию, типа "id=1" и подобные.

    Получилось вот что:
    ^.*[a-zA-Z]=[0-9]+.*$
    Но она пропускает варианты типа
    id=10abc
    id=1abc0

    Логику я понимаю, после чисел нужна проверка, чтобы это был или конец строки, или символ & или ;
    Но как это правильно записать?
     
  2. qaz

    qaz Elder - Старейшина

    Joined:
    12 Jul 2010
    Messages:
    1,551
    Likes Received:
    173
    Reputations:
    75
    я лично совсем не понял что вам нужно от вашей регулярки
     
  3. Vald

    Vald Member

    Joined:
    6 Aug 2009
    Messages:
    25
    Likes Received:
    16
    Reputations:
    0
    Из списка сайтов типа:
    site.ru/index.php
    site.ru/index.php?id=10
    site.ru/index.php?id=abc
    site.ru/index.php?id=10abc
    site.ru/index.php?id=a10bc
    site.ru/index.php?id=1abc0
    site.ru/index.php?id=10&cid=10
    site.ru/index.php?id=10;cid=10
    Нужно получить только:
    site.ru/index.php?id=10
    site.ru/index.php?id=10&cid=10
    site.ru/index.php?id=10;cid=10

    Сейчас же я получаю, кроме нужного, еще и:
    site.ru/index.php?id=10abc
    site.ru/index.php?id=1abc0
     
  4. qaz

    qaz Elder - Старейшина

    Joined:
    12 Jul 2010
    Messages:
    1,551
    Likes Received:
    173
    Reputations:
    75
    ну если нужночто-то боле универсальное, то я бы сделал так
    Code:
    <?
    
    $text = "site.ru/index.php
    site.ru/index.php?id=10
    site.ru/index.php?id=abc
    site.ru/index.php?id=10abc
    site.ru/index.php?id=a10bc
    site.ru/index.php?id=1abc0
    site.ru/index.php?id=10&cid=10
    site.ru/index.php?id=10;cid=10";
    
    $ex = explode("\n",$text);
    
    
    foreach($ex as $str){
    $true = 1;
    preg_match_all("/=([0-9a-zA-Z]{1,20})/",$str,$pars);
    
    if( !count($pars[1]) )    {
    $true = 0;
                            }
    foreach($pars[1] as $str2)    {
    if( !is_numeric($str2))    {
    $true = 0;
                            }
                                }
    if($true){
    echo $str."<br>";
            }
    
    
    
    }
    
    
    ?>
     
    Vald likes this.
  5. Strilo4ka

    Strilo4ka

    Joined:
    5 Apr 2009
    Messages:
    709
    Likes Received:
    729
    Reputations:
    948
    PHP:
    <?
    $links = <<<eol
    site.ru/index.php
    site.ru/index.php?id=10
    site.ru/index.php?id=abc
    site.ru/index.php?id=10abc
    site.ru/index.php?id=a10bc
    site.ru/index.php?id=1abc0
    site.ru/index.php?id=10&cid=10
    site.ru/index.php?id=10;cid=10
    eol;

    preg_match_all('|.+=\d+(?![\w%]+)|',$links,$res);

    echo 
    "<pre>";
    print_r($res);
    echo 
    "</pre>";
     
    Vald likes this.