[Регулярки & Mod_Rewrite] Задай вопрос, получи ответ.

Discussion in 'PHP' started by .:EnoT:., 19 Nov 2008.

Thread Status:
Not open for further replies.
  1. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    InfectedM <a href="([^"]+?)#comment">
     
    _________________________
  2. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    155
    Likes Received:
    6
    Reputations:
    0
    Здравствуйте. Имеется исходник страницы, на которой много записей вида
    PHP:
    <li><a href="/127.0.0.1" title="127.0.0.1">127.0.0.1</a></li>
    <
    li><a href="/%D0%9D%D1%83%D0%B1" title="Нуб">Нуб</a></li></ul>
    Подскажите пожалуйста регулярку(для php) которая позволит извлечь все ссылки (в данном случае /127.0.0.1, /%D0%9D%D1%83%D0%B1) и записать в массив.
     
  3. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    PHP:
    <?php
    $txt 
    '<li><a href="/127.0.0.1" title="127.0.0.1">127.0.0.1</a></li> 
    <li><a href="/%D0%9D%D1%83%D0%B1" title="Нуб">Нуб</a></li></ul>'
    ;

    if(
    preg_match_all('#<a[^>]*? href="(.*?)"#',$txt,$m))
    print_r($m[1]);
    ?>
     
  4. OdaN

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

    Joined:
    4 Mar 2006
    Messages:
    192
    Likes Received:
    17
    Reputations:
    1
    подскажите пожалуйста регулярку, для обработки телефонов... нужно оставить только числа, убрав знаки. формат разный:
    Code:
    123-45-67
    123-4567
    8(123)4567890
    8(123) 456-78-90
    8-123-456-78-90
    8 123 456 78 90
    и еще куча всего, в том числе попадаються с опечатками. нужно оставить только цифры, т.е. привести к виду 1234567.
     
  5. PaCo

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

    Joined:
    6 Feb 2008
    Messages:
    436
    Likes Received:
    138
    Reputations:
    25
    @OdaN
    PHP:
    <?php
    echo preg_replace('#[^\d\r\n]#','',"123-45-67
    123-4567
    8(123)4567890
    8(123) 456-78-90
    8-123-456-78-90
    8 123 456 78 90"
    );
    @InfectedM жадность надо ставить меньше - U.
     
    1 person likes this.
  6. OdaN

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

    Joined:
    4 Mar 2006
    Messages:
    192
    Likes Received:
    17
    Reputations:
    1
    Еще вопрос: есть строка
    Code:
    Иванов Иван Иваныч
    Нужно на выходе сделать Иванов И. И., но задница в том, что строка в юникоде. От модификатора "u" толку никакого =(
     
  7. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    OdaN iconv или ближайший аналог на вашем яп

    Покажите код, как вариант, если строка только русская - можно считать ее бинарной строкой и сохранять первые два символа после пробела.

    PHP:
    $str 'Иванов Иван Иваныч';
    echo 
    preg_replace('~^([^ ]+) (.{2})[^ ]* (.{2})[^ ]*$~''\1 \2. \3.'$str);
    С модификатором u - тоже работает:
    PHP:
    $str 'Иванов Иван Иваныч';
    echo 
    preg_replace('~^([^ ]+) (.)[^ ]* (.)[^ ]*$~u''\1 \2. \3.'$str);
    Все файлы сохранять в UTF-8 без BOM
     
    _________________________
    #1267 Gifts, 6 Sep 2010
    Last edited: 6 Sep 2010
    1 person likes this.
  8. OdaN

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

    Joined:
    4 Mar 2006
    Messages:
    192
    Likes Received:
    17
    Reputations:
    1
    Да, действительно все работает. Спасибо большое =)
    Судя по всему проблема не в кодировке была, а в кривых руках...
     
  9. spamoney

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

    Joined:
    26 Dec 2006
    Messages:
    120
    Likes Received:
    7
    Reputations:
    1
    Здравствуйте, есть регулярка:

    Code:
    if (preg_match("#(\A(19[7-9][0-9]|20\d\d)([- /.])([1-9]|0[1-9]|1[012])([- /.])(0[1-9]|[12][0-9]|3[01])\z)|(\A(19[7-9][0-9]|20\d\d)([- /.])([1-9]|0[1-9]|1[012])\z)|(\A(19[7-9][0-9]|20\d\d)\z)#", $date)) echo "OK";
    Проверяет является ли строка датой в формате:

    YYYY-MM-DD
    или
    YYYY-MM
    или
    YYYY

    Где:
    YYYY - год, от 1970 до 2099
    MM - месяц, от 1 или 01 до 12
    DD - день, от 01 до 31

    Можно ли составить аналогичное регулярное выражение только, что бы оно было короче?
     
  10. _exp1oit

    _exp1oit New Member

    Joined:
    18 Jun 2010
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    Как спарсить значение из ошибки mysql Duplicate entry 'значение1' for key 1?
    Значение может являться любыми регистро-независимыми символами русского и английского алфавита, включая подчеркивания, пробелы и любые спецсимволы.
     
    #1270 _exp1oit, 11 Sep 2010
    Last edited: 11 Sep 2010
  11. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    '#mysql Duplicate entry \'(.*)\' for key 1#Uis'
     
  12. _exp1oit

    _exp1oit New Member

    Joined:
    18 Jun 2010
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    Спасибо, это почти то, что нужно, только надо, чтобы единица после значения, не попадала в выборку.
     
  13. #Wolf#

    #Wolf# Elder - Старейшина

    Joined:
    26 Mar 2008
    Messages:
    375
    Likes Received:
    166
    Reputations:
    16
    PHP:
    '#mysql Duplicate entry \'(.*)1\' for key 1#Uis'
     
  14. Rastamanka

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

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Подскажите как разделить на php.
    В общем в переменную приходит число к примеру = 15654321.
    Надо чтобы это число разбить на 1565 на 43 и 21.
    То есть с конца по 2 раза по 2 цифры а остальное число целое.
    Но бывает что приходит просто 2 надо чтобы оно осталось без изменений.
    Надеюсь понятно объяснила.
     
  15. GalaX

    GalaX New Member

    Joined:
    6 Sep 2010
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    PHP:
    $s 'owaei jfoaiwejfoawij 234214123449865 ewafeaw wea814465416';
    echo 
    preg_replace('~((?<=\d))(\d{2})(\d{2})(?=\b)~''$1 $2 $3'$s);
     
  16. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    PHP:
    <?php
    $int 
    15654321;

    $part1 substr($int,-2);
    $part2 substr($int,-4,2);
    $part3 substr($int,0,-4);

    echo 
    $part1.'<br>'
    echo 
    $part2.'<br>'
    echo 
    $part3.'<br>'
    ?>
    GalaX, не все так сложно, чтоб к регуляркам прибегать =)
     
  17. Rastamanka

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

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Подскажите в общем приходи текст в виде
    PHP:
    <root error="0">
        <
    mail id="6097675" type="2" ctime="1284843388" attach="1" read="0">
            <
    from uid="52979">
                <![
    CDATA[root]]>
            </
    from>
            <
    subject>
                <![
    CDATA[спасибо]]>
            </
    subject>
        </
    mail>
        <
    mail id="6097690" type="2" ctime="1284843422" attach="1" read="0">
            <
    from uid="52979">
                <![
    CDATA[toor]]>
            </
    from>
            <
    subject>
                <![
    CDATA[спасибо]]>
            </
    subject>
        </
    mail>
    </
    root>
    Надо выпарсить данные между
    1) mail id=" и " type=
    2) <![CDATA[ и ]>
    Не там где спасибо а там где root и toor

    Пытаюсь на первый сделать вот таким кодом
    PHP:
         $pattern "#mail id=\"/(.+)\"/ type)#";
         
    $change_check preg_match($pattern ,$content2,$data4);
         
    print_r($data4);
    Но он мне выводит Warning: preg_match() [function.preg-match]: Compilation failed: unmatched parentheses at offset 21 in Z:\home\localhost\www\ounder\index.php on line 31
     
    #1277 Rastamanka, 19 Sep 2010
    Last edited: 19 Sep 2010
  18. M@rkus

    M@rkus Banned

    Joined:
    25 Jul 2010
    Messages:
    43
    Likes Received:
    5
    Reputations:
    0
    PHP:
    preg_match('#mail id="([0-9]+)" type="(.*?)"#'$file$a);
    print_r($a);
    preg_match_all('#CDATA\[(.*?)\]\]\>#'$file$bb);
    print_r($bb); 
     
  19. Rastamanka

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

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Так не подходит потому что получаем
    PHP:
     <root error="0">
     <
    mail id="6097690" type="2" ctime="1284843422" attach="0" read="1">
     <
    from uid="52979">
     <![
    CDATAСобчинский
      
    ]]> 
      </
    from>
     <
    subject>
     <![
    CDATAспасибо
      
    ]]> 
      </
    subject>
      </
    mail>
     <
    mail id="6098165" type="2" ctime="1284846155" attach="1" read="1">
     <
    from uid="720848">
     <![
    CDATAБог_Смерти
      
    ]]> 
      </
    from>
     <
    subject>
     <![
    CDATA
      ]]> 
      </
    subject>
      </
    mail>
     <
    mail id="6098167" type="2" ctime="1284846156" attach="1" read="0">
     <
    from uid="901847">
     <![
    CDATAifris
      
    ]]> 
      </
    from>
     <
    subject>
     <![
    CDATA
      ]]> 
      </
    subject>
      </
    mail>
     <
    mail id="6098166" type="2" ctime="1284846156" attach="1" read="0">
     <
    from uid="832639">
     <![
    CDATA0111
      
    ]]> 
      </
    from>
     <
    subject>
     <![
    CDATA
      ]]> 
      </
    subject>
      </
    mail>
      </
    root>
    А он мне выводит
    Array
    (
    [0] => mail id="6097690" type="2"
    [1] => 6097690
    [2] => 2
    )
    Array
    (
    [0] => Array
    (
    [0] => CDATA[Собчинский]]>
    [1] => CDATA[спасибо]]>
    [2] => CDATA[Бог_Смерти]]>
    [3] => CDATA[]]>
    [4] => CDATA[ifris]]>
    [5] => CDATA[]]>
    [6] => CDATA[0111]]>
    [7] => CDATA[]]>
    )

    [1] => Array
    (
    [0] => Собчинский
    [1] => спасибо
    [2] => Бог_Смерти
    [3] =>
    [4] => ifris
    [5] =>
    [6] => 0111
    [7] =>
    )

    )
     
  20. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    PHP:
    <?php
    $txt 
    '<root error="0"> 
        <mail id="6097675" type="2" ctime="1284843388" attach="1" read="0"> 
            <from uid="52979"> 
                <![CDATA[root]]> 
            </from> 
            <subject> 
                <![CDATA[спасибо]]> 
            </subject> 
        </mail> 
        <mail id="6097690" type="2" ctime="1284843422" attach="1" read="0"> 
            <from uid="52979"> 
                <![CDATA[toor]]> 
            </from> 
            <subject> 
                <![CDATA[спасибо]]> 
            </subject> 
        </mail> 
    </root> '
    ;


    if(
    preg_match_all('#mail id="(\d+)".*\[CDATA\[(.*)\]\]#Uis'$txt$m)) {
        
    print_r($m);
        
    }
    ?>
    Результат:
    Думаю всё понятно?
     
Thread Status:
Not open for further replies.