Помогите регуляркой...

Тема в разделе "Регулярные выражения", создана пользователем Zircool, 11 сен 2008.

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

    Zircool Создатель

    Регистр.:
    1 июн 2008
    Сообщения:
    35
    Симпатии:
    43
    Функция скрипта это удаление из базы ссылок tags.php ссылки с нужным именем...

    Основная задача это вытащить из ссылки её путь, что бы потом функцией unlink удалить этот файл
    Ссылки такие:

    <a href="golubi.php">Голуби</a>,
    <a href="medved.php">Медведи</a>,

    PHP:
    $filename=trim($_POST['istagdel']);
    $filetagsstring=file_get_contents('tags.php');
    preg_match('/\<a href=\"(.*?)\"\>'.$filename.'\<\/a\>,/is'$filetagsstring,$res);
    echo 
    $res[1];
    Но ничего не выводит. Проблема в регулярке?
     
  2. pslava

    pslava

    Регистр.:
    16 май 2007
    Сообщения:
    618
    Симпатии:
    122
    используй preg_match_all, а то preg_match используется для проверки есть ли вхождения, и это будет либо 0 раз (нет совпадений), либо 1 раз, поскольку preg_match() остановит поиск после первого найденного
     
  3. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Ага если ссылка с одним содержанием встречается много раз, но если она встречается только один раз скрипт должен правильно работать, скорее всего дело в несоответствии кодировок $_POST['istagdel'] и tags.php.
    З.Ы. зачем столько экранированных символов, здесь можно обойтись вообще без них:
    '{<a href="(.*?)">'.$filename.'</a>,}is'
     
  4. sasha181

    sasha181 Постоялец

    Регистр.:
    18 апр 2007
    Сообщения:
    100
    Симпатии:
    25
    PHP:
    preg_match("/href=('|\")([^<>'\"]+)('|\")/is"$filetagsstring,$res);
    print_r($res);
    должно помочь
     
  5. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    sasha181
    Человеку, как я понимаю, нужно выбрать определенные ссылки по названию, и достастать их href, четко зная формат в котором они записанны. А для этого его регулярка подходит.
    А чтобы просто найти произвольный href в тексте, правильней записать
    Код:
    href=(?:"[^"]*"|'[^']*'|[a-zA-Z0-9_:.-]+)
    
    В отличии от вашего оно найдет также:
    href="http://site.ru/index.php?s='mama'"
    href=index.html
    href=""
    Но не найдет:
    href='превед"
     
  6. sasha181

    sasha181 Постоялец

    Регистр.:
    18 апр 2007
    Сообщения:
    100
    Симпатии:
    25
    на самом деле я не очень силён в регулярках, потому вполне мог и упустить что-то.
    Но всё же не во всём могу согласиться с Вами. Например, мне ещё ни разу не приходилось встречать ссылки типа
    href="http://site.ru/index.php?s='mama'"
    а вот такие приходилось
    href="http://site.ru/index.php?s=мама"

    а вот
    href='превед"
    это действительно проблема
    подумаю над тем как исправить

    Я вот только не совсем понял Вашу регулярку.
    По какому принципу он находит знаки / и ?
    если Вас не затруднить, объясните пожалуйста
    также там похоже упущен знак +
    он далеко не редкость в GET запросах
     
  7. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Главное, что стандарт позволяет использовать одинарные кавычки внутри двойных и наоборот. Такие ссылки может видеть и неприходилось, но вот по типу:
    href="javascript:alert('привет');"
    и сам писал не раз.

    sasha181
    Находит по принципу [^"]- любой сивол кроме кавычки *-произвольное число раз. Вобще там три альтернативы(разделенные знаком |)
    первая находит значения вида:
    href="бла-бла-бла"
    вторая:
    href='бла-бла-бла'
    третья:
    href=бла-бла-бла (туту согласно документации бла-бла-бла может быть только символами [a-zA-Z0-9_:.-])

    Таже регулярка в режиме free-spacing, с комментариями
    Код:
    href=(?:
        "
           [^"]* #любой символ кроме кавычки произвольное число раз
        "
     |
        '
           [^']* #любой символ кроме одинарной кавычки произвольное число раз
        '
     |
        [a-zA-Z0-9_:.-]+ #символ из перечисленных хотябы один раз, либо больше
    )
    
     
    sasha181 нравится это.
  8. Zircool

    Zircool Создатель

    Регистр.:
    1 июн 2008
    Сообщения:
    35
    Симпатии:
    43
    Ок спасибо все большое за помощь. Но опять столкнулся с проблемой, вроде бы правильно регулярку пишу.... ообщем есть файл results.php Который имеет вид

    PHP:

    <table>
    <
    tr><td>IE</td><td>0<td></tr>
    <
    tr><td>Mozilla</td><td>0<td></tr>
    <
    tr><td>Netscape</td><td>0<td></tr>
    <
    tr><td>Opera</td><td>0<td></tr>
    </
    table>
    Из него надо вытянуть цифровые значения... Вообще это скрипт голосоваяния, цифры это и есть количество голосов. Пишу так
    PHP:
    <html>
    <head>
    <title>Голосование</title>
    </head>
    <form  method="post">
    <h1>Ваш браузер? </h1>
    <input type="radio" name="vote" value="IE">IE<br>
    <input type="radio" name="vote" value="Mozilla">Mozilla<br>
    <input type="radio" name="vote" value="Netscape">Netscape<br>
    <input type="radio" name="vote" value="Opera">Opera<br>
    <input type="submit" name="sub" value="Голосовать"><br>
    </form>
    <body>
    </body>
    </html>

    <?php
    if(isset($_POST['sub']))
    {
    $results=file_get_contents('results.php');
    $data=trim($_POST['vote']);
    preg_match('#<tr><td>'.$data.'</td><td>(.*?)</td></tr>#',$results,$res);
    echo 
    $res[1];
    }



    ?>

     
  9. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Наверно поэтому:)
    <tr><td>Opera</td><td>0<td></tr>
     
Статус темы:
Закрыта.