Помогите с регулярками в php

Discussion in 'PHP' started by SultanOFF, 12 Jul 2010.

  1. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    156
    Likes Received:
    6
    Reputations:
    0
    Здравствуйте. С PHP работаю впервые(легкий, интересный язык :) однако) но вот запнулся на регулярках:
    Есть текст вида: "http://supersait.ru/lalalla =чтотонаписано"
    нужно вытащить в $a ссылку, а в $b "чтотонаписано". Делаю так:
    Code:
    $url =  fgets ($file, 1024); 
    $template = "/=(\w*)\n/";
     $result = preg_match($template, $url, $maches);
      echo "$maches[1]<br>";
    однако выводит пустой лист :mad: Как подправить?
     
  2. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    Он у тебя в соответствие затягивает всю строку в $maches[0], а $maches[1] пустой.
    надо типа

    "/http:\/\/(supersait.ru\/lalalla=){1}(.*){1}/"

    , и потом \1 равно http://supersait.ru/lalalla = а \2 равно чтотонаписано.
    Либо /^=(.+)$/
    P.S.:http://pyha.ru/forum/topic/19.0
     
    #2 SHiNiGaMi, 12 Jul 2010
    Last edited: 12 Jul 2010
  3. Winst0n

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

    Joined:
    19 Aug 2008
    Messages:
    92
    Likes Received:
    5
    Reputations:
    0
    $url = "http://supersait.ru/lalalla=чтотонаписано";
    $template = "#=(.*)#";
    $result = preg_match($template, $url, $maches);
    echo "$maches[1]<br>";


    альтернатива)
    $url = "http://supersait.ru/lalalla=чтотонаписано";
    $result = explode("=", $url);
    echo $result[1];
     
  4. miako

    miako Member

    Joined:
    20 Jan 2010
    Messages:
    154
    Likes Received:
    13
    Reputations:
    5
    Лучше не echo $result[1];, а print_r($result);
     
  5. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    156
    Likes Received:
    6
    Reputations:
    0
    хорошо спасибо, воспользовался методом Winston. Возник еще один вопрос:
    есть текстовый файл на серве text.txt в нем много строк вида
    sait.ru=lalala
    ololo.ru=uidsd
    tratata.ru=super
    и т.д.
    Как Мне допустим в строке ololo.ru=uidsd
    заменить значение uidsd на свое? Еще нужно учитывать что может быть написано просто ololo.ru и тогда нужно приписать =uidsd. Если открывать через
    Code:
    $file=fopen("file.txt", "a")
    то добавляется в конец, а Мне нужно исправить в определенной строке. Через
    Code:
    $file=fopen("file.txt", "w")
    чтото совсем не получается :( Подскажите пожалуйста, очень прошу :)
     
    #5 SultanOFF, 12 Jul 2010
    Last edited: 12 Jul 2010
  6. miako

    miako Member

    Joined:
    20 Jan 2010
    Messages:
    154
    Likes Received:
    13
    Reputations:
    5
    mixed preg_replace ( mixed $patt ern, mixed $replacement, mixed $ subject [, int $limit] )
    Выполняет поиск в строке subject совпадений с шаблоном pattern и заменяет их на replacement. В случае, если параметр limit указан, будет произведена замена limit вхождений шаблона; в случае, если limit опущен либо равняется -1, будут заменены все вхождения шаблона.
    $replacement может содержать ссылки на подмаски шаблона. Таким образом, можно поменять в строке местами части, соответствующие двум разным подмаскам.
     
  7. Compton

    Compton Member

    Joined:
    31 Jan 2010
    Messages:
    290
    Likes Received:
    25
    Reputations:
    0
    PHP:
    file_put_contents('lol.txt',preg_replace('/=.+/','',file_get_contents('lol.txt'))."\r\n");
     
  8. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    156
    Likes Received:
    6
    Reputations:
    0
    Compton спасибо, хорошая функция. Но почему то когда Я записываю так:
    Code:
    $f = 'http://adres.com';
     file_put_contents('urls.txt',preg_replace('/$f=.+/',"$f.=Супермен",file_get_contents('urls.txt'))."\r\n");
    не работает :( Почему? И как можно учесть, и как быть если в слове нет знака равно?
     
  9. Compton

    Compton Member

    Joined:
    31 Jan 2010
    Messages:
    290
    Likes Received:
    25
    Reputations:
    0
    1) При поставлении адреса знаки "//" будут считаться ограничителями выражения
    2)подставлять так -
    Code:
    '/'.$f.'=.+/'
     
  10. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    156
    Likes Received:
    6
    Reputations:
    0
    выходит ошибка
    :(
     
  11. Compton

    Compton Member

    Joined:
    31 Jan 2010
    Messages:
    290
    Likes Received:
    25
    Reputations:
    0
    вообще поменяй ограничитель регулярки на '#'
     
  12. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    156
    Likes Received:
    6
    Reputations:
    0
    написал так
    вроде теперь работает



    тока хотел написать :D . Спасибо, ты Мне очень помог :)
     
  13. [0rby]

    [0rby] Banned

    Joined:
    9 Jul 2010
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    PHP:
    $url =  fgets ($file1024); 
    $template "|=(\w+)\n|";
     
    $result preg_match_all($template$url$maches);
    foreach(
    $matches[0] as $tmp)
    {
      echo 
    trim($tmp)."\r\n";
    }