цель - вытащить слова, состоящие из более(либо равно) чем 3-х символов, не находящихся в скобках вида [f{...}f] "/(?<!\[f\{)(\S{3,})(?!\}f\])/" - послушно вытаскивает слова с нужным количеством символов, но упорно игнорирует скобки, может кто-нибудь видит почему? пример на [f{мама}f] мыла раму у окна. должен вытащить мыла раму окна , а вытаскивает [f{мама}f] мыла раму окна
огромное спасибо за вариант, но это все же усложнение, ведь с помощью рег. выражения все-равно придется символы вытаскивать. но если не пойму как можно так решить эту проблему - буду "реплейсить" =)
спасибо, я Вам очень благодарна! я наконец-то могу поспать пойти!!!! =))) но мне очень теперь интересно понять что это такое было. [^\s\[\]\{\}] - не невидиме символы и скобки [] {} ? а почему скобки?
Ginka Вообще-то я набрал от балды, но рад, что у вас все заработало Серьезно - вам нужно было добавить условие, что внутри искомой области (вокруг которой не должно быть ограничителей) не должна случайно встретиться другая пара ограничителей, т.е. более жесткое условие на внутреннюю часть. Отсюда запрет на скобки.
но по большому счету, для меня почти все пока загадочно - со вчерашнего дня вообще с php общаюсь. так что это норма
Ginka Внутри "[f{мама}f]" скобки как раз есть - а вот внутри "мама" их нет Регулярные выражения вообще замороченная штука, так что вы не одиноки EDIT: Хм, боюсь, мой метод тоже не будет работать... попробуйте проверить строку [f{abcde}f] (внутренняя часть длиннее 4 символов). Подозреваю, что он просто отступит на 1 символ слева и справа и вырежет "bcd". Если так, последуйте совету ЧорногоДемона - удалите из строки все лишнее, потом ищите нужное.
блин, радость оказалась немного преждевременной оказывается, не выбрасываются слова длиной более 4-х символов
делать всё с помощью одного единственного регулярного выражения - это реальное усложнение. а разделение одной сложной регулярки на две простые - наоборот, упрощение.
dark-demon, я бы реально сделала на данный момент хоть как-нибудь, но глаз наcтолько "замылился", что никак уже не получается я и preg_replace уже пробовала, но туда же тоже нужно регулярное выражение вписать. а как его можно упростить, усли нужно удалить слово, входящее в заданную комбинацию скобок? я не вижу. разве что отдельно проверку делать на слова(любой длины) со скобками, а потом вычленять с помощью preg_match_all слова с длиной более 3-х символов? радует, что хоть последнее работает: preg_match_all("/(\S{3,})/", $str, $matches, PREG_SET_ORDER);
попробуйте так, что ли... PHP: <?php $str = '[f{мама}f] мыла раму у окна пока [f{папа}f] расправлялся с пельменями'; preg_match_all ('/\[f\{\w*\}f\]|(\w{3,})/', $str, $matches); if (count ($matches)) print_r (array_filter ($matches[1])); ?>
dark-demon у меня не работает preg_replace('/\[.*?\]/,'',$str); и preg_replace("/\[f\{.*\}f\]/",'',$str); - тоже не работает. это я к тому, что мне нужны скобки именно [f{ }f], а не просто [] - так можно
stas_t, кажется это то что нужно, спасибо большое. простите за совсем ламерский вопрос: как добиться того, чтобы значения matches перенести в строковую переменную ? (слова разделены пробелами)
PHP: <?php $str = '[f{мама}f] мыла раму у окна пока [f{папа}f] расправлялся с пельменями'; preg_match_all ('/\[f\{\w*\}f\]|(\w{3,})/', $str, $matches); $str = implode(" ",$matches); // 13-я строка echo $str; ?> Notice: Array to string conversion in z:\home\localhost\www\MY\3.php on line 13. я собственно и хочу переконвертировать - почему предупреждает?
Ginka PHP: <?php header('Content-Type: text/plain'); print_r($matches); // Это чтобы посмотреть, что внутри массива ?> А implode объединяет только один уровень массива. Ну и stas_t говорил, что надо работать не с $matches а с PHP: <?php array_filter ($matches[1]) ?> т.е. PHP: <?php echo implode(' ', array_filter ($matches[1])); ?>
AlexGousev, stas_t, dark-demon, Dagdamor, господа, огромное вам спасибо!!! я вам безмерно благодарна!!!