Отрезать часть предложения

Тема в разделе "Регулярные выражения", создана пользователем serjinio, 31 май 2010.

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

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    Помогите с регуляркой надо отрезать кусок текста (в конце)

    fff_kk-12.jpg
    hhhhhhhh_125X300.png
    iss_art01_.jpg
    iss_art01-.jpg
    fff_hhhh-jjjj-777.gif
    fff-hhhh-jjjj_777.gif

    на выходе

    fff_kk
    hhhhhhhh
    iss_art01
    iss_art01
    fff_hhhh-jjjj
    fff-hhhh-jjjj

    те отрезать всё что начинается с -_(может быть цифра)(+?\.(jpe?g|gif|png))
     
  2. Virtual

    Virtual Создатель

    Регистр.:
    17 фев 2007
    Сообщения:
    35
    Симпатии:
    9
    PHP:
    <?php
    $txt
    ="fff_kk-12.jpg
    hhhhhhhh_125X300.png
    iss_art01_.jpg
    iss_art01-.jpg
    fff_hhhh-jjjj-777.gif
    fff-hhhh-jjjj_777.gif"
    ;
    $out=preg_replace("![\-_]\d*\.(jpe?g|gif|png)!i","",$txt);
    print_r($out);
    ?>
    Только вот, hhhhhhhh_125X300.png - не вписывается в общий паттерн никак. Ибо, если вписать, могут попадать и другие строки, в которых не надо вырезать ничего.
    Вот, на всякий случай, паттерн, захватывающий и эту ситуацию:
    PHP:
    $out=preg_replace("![\-_]\d*\w?\d*\.(jpe?g|gif|png)!i","",$txt);
     
    serjinio нравится это.
  3. Alix

    Alix

    Регистр.:
    27 янв 2008
    Сообщения:
    234
    Симпатии:
    84
    По мотивам Virtual
    PHP:
    $txt="fff_kk-12.jpg
    hhhhhhhh_125X300.png
    iss_art01_.jpg
    iss_art01-.jpg
    fff_hhhh-jjjj-777.gif
    fff-hhhh-jjjj_777.gif"
    ;
    $out preg_replace("/(.*)((\-|_).*?(jpe?g|gif|png))/i""$1"$txt);
    print_r($out);
     
    serjinio нравится это.
  4. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    PHP:
    $txt="fff_kk-12.jpg 
    hhhhhhhh_125X300.png 
    iss_art01_.jpg 
    iss_art01-.jpg 
    fff_hhhh-jjjj-777.gif 
    fff-hhhh-jjjj_777.gif"

    if (
    preg_match("/(.+?)[\-|_]([^\-|_]*)\.[a-zA-Z0-9]{3,4}/i",  $txt$rg)
        
    $out $rg[1];
    print 
    $out;
     
  5. Virtual

    Virtual Создатель

    Регистр.:
    17 фев 2007
    Сообщения:
    35
    Симпатии:
    9
    Указано ведь, конкретные расширения. Т.е. человеку явно нужны картинки. :) И, в конструкции вида [\-|_] этот символ "|" лишний, и не является логическим ИЛИ, как в конструкции с круглыми скобками...
     
  6. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    Ребята,спасибо выручили всё чётко работает ,но встретился ещё гемор

    PHP:
    dddddddd_09_1280x1024.jpg
    AFbb_Adcd
    -Shhhh_77_1600x1200.jpg
    патерн их пропускает

    AFbb_Adcd-Shhhh_77
    dddddddd_09


    помогите подкорректировать. Заранее спасибо
     
  7. Alix

    Alix

    Регистр.:
    27 янв 2008
    Сообщения:
    234
    Симпатии:
    84
    serjinio, попробуйте мой вариант. Он немного универсальнее чем у Virtual'a
     
  8. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    К сожалению он тоже пропускает то, что я написал выше :(
     
  9. Virtual

    Virtual Создатель

    Регистр.:
    17 фев 2007
    Сообщения:
    35
    Симпатии:
    9
    Так а он и должен пропускать. Точнее, не пропускать, а давать на выходе
    AFbb_Adcd-Shhhh_77
    dddddddd_09
    если исходные данные были
    dddddddd_09_1280x1024.jpg
    AFbb_Adcd-Shhhh_77_1600x1200.jpg
    Т.е. это не паттерн их пропускает, это еще один паттерн, который надо запихнуть в регулярку. ;)

    Если же надо убирать и _77 а так же _09, то
    PHP:
    <?php
    $txt
    ="fff_kk-12.jpg
    hhhhhhhh_125X300.png
    iss_art01.jpg
    iss_art01-.jpg
    iss_art01_.jpg
    fff_hhhh-jjjj-777.gif
    fff-hhhh-jjjj_777.gif
    dddddddd_09_1280x1024.jpg
    AFbb_Adcd-Shhhh_77_1600x1200.jpg
    "
    ;
    $out preg_replace("/[\-_]*?(([\-_]+[\d]+)+[\w]?[\d]*?[\-_]?)?\.(jpe?g|gif|png)([\r\n]|^|$)/i"""$txt); 
    print_r($out);
    ?>
    Вариант Alix, отрежет от iss_art01.jpg все, кроме "iss", что не входит в изначальное условие..
     
    serjinio нравится это.
  10. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    отлично ,то что надо applause:ay:
     
Статус темы:
Закрыта.