регулярные выражения

Discussion in 'PHP' started by Дикс, 3 Dec 2007.

  1. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    пытаюсь написать собственный парсер для ИМГ тегов.

    PHP:
    $data "текст факинг текст [img]hack.jpg[/img] второй текст [img]deex.jpg[/img]";
    eregi("(\[img\]([a-z.]+)\[/img\])"$data$regs);

    echo (
    "<pre>");
    print_r($regs);
    echo (
    "</pre>");
    на данный момент встал вопрос:
    почему результат выводит один тег два раза?

    PHP:
    Array
    (
        [
    0] => [img]hack.jpg[/img]
        [
    1] => [img]hack.jpg[/img]
        [
    2] => hack.jpg
    )
     
  2. groundhog

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

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Он сначала тебе выводит полностью шаблон, потом совпадение с первым подшаблоном, потом со вторым.
     
  3. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    ничо не понимаю

    ну а здесь что может быть не так?
    PHP:
      $str "текст факинг текст [img]hack.jpg[/img] второй текст [img]deex.jpg[/img]";
      
    $pattern "/([img\])/i";
      
    $replacement "1 \${1}";
      print 
    preg_replace($pattern$replacement$str); // line 30
    PHP:
    Warningpreg_replace() [function.preg-replace]: Compilation failedmissing terminating ] for character class at offset 8 in h:\home\localhost\www\txtdb\r.php on line 30
     
  4. groundhog

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

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Ошибка в паттерне:

    Обрати внимание, что у тебя внутри шаблона идёт квадратная скобка [. В терминах regexp всё что между квадратных скобок трактуется как класс символов ([a-zA-Z] и т.д.). У тебя же, как я понимаю, знчение квадратной скобки должно быть "как символ"... Вот и экранируй его тогда... Причём вторую скобку ты проэкранировал, а первую забыл... Делай так:

     
  5. AkyHa_MaTaTa

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

    Joined:
    19 Mar 2007
    Messages:
    558
    Likes Received:
    306
    Reputations:
    27
    Че та я не доганю, ты хочешь заменить все теги на img на 1$
     
  6. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    cпасибо большое, тока я всё ещё не могу получить желаемое:

    PHP:
     $str "текст факинг текст [img]hack.jpg[/img] второй текст [img]deex.jpg[/img]";
    $pattern "/(\[img\])([a-z.A-Z0-9]+)(\[/img\])/i";
      
    $replacement "<a href='img/\${2}'>\${2}</a>";
      print 
    preg_replace($pattern$replacement$str); // line 30
    проблема вот в этом:
    $pattern = "/(\[img\])([a-z.A-Z0-9]+)(\[/img\])/i";
    когда я добавляю этот кусок, у меня всё бьётся. а без него я получаю то что хочу -
    [​IMG] превращается в ссылку, но в конце остаётся [/img]:


    текст факинг текст hack.jpg[/img] второй текст deex.jpg[/img]
     
  7. groundhog

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

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    А так не пробовал?

     
  8. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    О да! Под вечер башка совсем варить отказывается :)
    Спасиба большое :)