За последние 24 часа нас посетили 17910 программистов и 1287 роботов. Сейчас ищут 1414 программистов ...

негативная проверка не получается

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

  1. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    цель - вытащить слова, состоящие из более(либо равно) чем 3-х символов, не находящихся в скобках вида [f{...}f]

    "/(?<!\[f\{)(\S{3,})(?!\}f\])/" - послушно вытаскивает слова с нужным количеством символов, но упорно игнорирует скобки, может кто-нибудь видит почему?

    пример
    на [f{мама}f] мыла раму у окна. должен вытащить мыла раму окна , а вытаскивает [f{мама}f] мыла раму окна
     
  2. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    думаю проще будет с сначала помощью preg_replace вырезать всё ненужное..
     
  3. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    огромное спасибо за вариант, но это все же усложнение, ведь с помощью рег. выражения все-равно придется символы вытаскивать. но если не пойму как можно так решить эту проблему - буду "реплейсить" =)
     
  4. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    уже 3 часа пытаюсь понять в чем загвоздка...
     
  5. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Ginka
    Попробуйте "/(?<!\[f\{)([^\s\[\]\{\}]{3,})(?!\}f\])/"
     
  6. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    спасибо, я Вам очень благодарна! я наконец-то могу поспать пойти!!!! =)))
    но мне очень теперь интересно понять что это такое было.
    [^\s\[\]\{\}] - не невидиме символы и скобки [] {} ?
    а почему скобки?
     
  7. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Ginka
    Вообще-то я набрал от балды, но рад, что у вас все заработало :D
    Серьезно - вам нужно было добавить условие, что внутри искомой области (вокруг которой не должно быть ограничителей) не должна случайно встретиться другая пара ограничителей, т.е. более жесткое условие на внутреннюю часть. Отсюда запрет на скобки.
     
  8. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    загадочно, ведь внутри [f{мама}f] нет скобок, а без них(в выражении) не работает :) еще раз спасибо!!!
     
  9. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    но по большому счету, для меня почти все пока загадочно - со вчерашнего дня вообще с php общаюсь. так что это норма :)
     
  10. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Ginka
    Внутри "[f{мама}f]" скобки как раз есть - а вот внутри "мама" их нет ;)
    Регулярные выражения вообще замороченная штука, так что вы не одиноки :)

    EDIT: Хм, боюсь, мой метод тоже не будет работать... попробуйте проверить строку [f{abcde}f] (внутренняя часть длиннее 4 символов). Подозреваю, что он просто отступит на 1 символ слева и справа и вырежет "bcd". Если так, последуйте совету ЧорногоДемона - удалите из строки все лишнее, потом ищите нужное.
     
  11. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    блин, радость оказалась немного преждевременной :(
    оказывается, не выбрасываются слова длиной более 4-х символов
     
  12. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    Dagdamor
    :)
     
  13. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Да, я то же самое подумал... сорри за дезинформацию :)
     
  14. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    да, что Вы, то что меня сдвинули с мертвой точки - уже подвиг :)
     
  15. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    делать всё с помощью одного единственного регулярного выражения - это реальное усложнение. а разделение одной сложной регулярки на две простые - наоборот, упрощение.
     
  16. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    dark-demon,
    я бы реально сделала на данный момент хоть как-нибудь, но глаз наcтолько "замылился", что никак уже не получается :)
    я и preg_replace уже пробовала, но туда же тоже нужно регулярное выражение вписать. а как его можно упростить, усли нужно удалить слово, входящее в заданную комбинацию скобок? я не вижу. разве что отдельно проверку делать на слова(любой длины) со скобками, а потом вычленять с помощью preg_match_all слова с длиной более 3-х символов?

    радует, что хоть последнее работает:
    preg_match_all("/(\S{3,})/", $str, $matches, PREG_SET_ORDER);
     
  17. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    preg_replace('/\[.*?\]/,'',$str);
     
  18. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    попробуйте так, что ли...
    PHP:
    1. <?php
    2. $str = '[f{мама}f] мыла раму у окна пока [f{папа}f] расправлялся с пельменями';
    3. preg_match_all ('/\[f\{\w*\}f\]|(\w{3,})/', $str, $matches);
    4.  
    5. if (count ($matches))
    6.     print_r (array_filter ($matches[1]));
    7. ?>
     
  19. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    dark-demon
    у меня не работает
    preg_replace('/\[.*?\]/,'',$str); :(

    и
    preg_replace("/\[f\{.*\}f\]/",'',$str); - тоже не работает. это я к тому, что мне нужны скобки именно [f{ }f], а не просто [] - так можно
     
  20. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    stas_t, кажется это то что нужно, спасибо большое. простите за совсем ламерский вопрос: как добиться того, чтобы значения matches перенести в строковую переменную ? (слова разделены пробелами)
     
  21. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    implode ()
     
  22. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    PHP:
    1. <?php
    2.  
    3.  $str = '[f{мама}f] мыла раму у окна пока [f{папа}f] расправлялся с пельменями';
    4.  preg_match_all ('/\[f\{\w*\}f\]|(\w{3,})/', $str, $matches);
    5.  $str = implode(" ",$matches);                                    // 13-я строка
    6.  echo  $str;
    7. ?>
    Notice: Array to string conversion in z:\home\localhost\www\MY\3.php on line 13.
    я собственно и хочу переконвертировать - почему предупреждает?
     
  23. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Ginka
    PHP:
    1. <?php
    2. header('Content-Type: text/plain');
    3. print_r($matches); // Это чтобы посмотреть, что внутри массива
    4. ?>
    А implode объединяет только один уровень массива.

    Ну и stas_t говорил, что надо работать не с $matches а с
    PHP:
    1. <?php
    2. array_filter ($matches[1])
    3. ?>
    т.е.
    PHP:
    1. <?php
    2. echo implode(' ', array_filter ($matches[1]));
    3. ?>
     
  24. Ginka

    Ginka Активный пользователь

    С нами с:
    19 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Питер
    AlexGousev,
    stas_t,
    dark-demon,
    Dagdamor,
    господа, огромное вам спасибо!!! я вам безмерно благодарна!!! :)
     
  25. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    к вашим услугам