Вопросы следующие, как я заметил preg_replace_callback находит вхождение по искомому регулярному выражению и отправляет массив данных в функцию, а потом заменяет найденное на то, что возвращает функция, например: Код (PHP): function fns($data) { foreach ($data as $k => $v) { echo "<div>{$k} => {$v}</div>"; } return strtoupper($data[0]); } $preg = '/(world)/i'; $str = 'hello world! this world is great'; echo preg_replace_callback($preg, 'fns', $str); // 0 => world // 1 => world // hello WORLD! this WORLD is great Мне надо что бы еще отправляло позицию найденного вхождения, желательно начало и конец, это возможно? (дополнительный поиск в самой функции не пойдет) Так же вопрос такой, допустим мне надо в определенном диапазоне найти слово и заменить его всего один раз (для этого в принципе и нужны позиции) возможно ли как нибудь после первой замены обрубить выполнение preg_replace_callback? (параметры limit и count тут вроде как не катят т.к. они считают сколько раз была вызвана функция, а не сколько раз в ней что то конкретное сделалось) Самое главное, приведенный пример это только пример, на самом деле поиск и замена осуществляется в html тегах, по этому замена без использования регулярных выражений не катит. И еще тоже главное, меня интересует, если это можно, то как? а если нет и все подобные замены надо делать альтернативным путем, то не нужно думать как, т.к. у меня уже все готово, только мне не нравиться этот альтернативный путь, вот ищу покороче. к примеру: Код (PHP): $str = 'hello world! this world is great. world is big!'; мне надо заменить слова world начиная с 20 позиции, т.е. в этом предложении первое слово world будет пропущено, второе будет заменено, а до третьего preg_replace_callback уже не должно дойти, и результат должен быть такой: Код (PHP): // hello world! this WORLD is great. world is big!
Замена происходит в любом случае, на то, что возвращает функция, а функция у меня должна работает следующим образом: и мне нужно что бы preg_replace_callback вырубалась после того как произойдет: к примеру: Код (PHP): $str = 'hello world! this world is great. world is big!'; мне надо заменить слова world начиная с 20 позиции, т.е. в этом предложении первое слово world будет пропущено, второе будет заменено, а до третьего preg_replace_callback уже не должно дойти, и результат должен быть такой: Код (PHP): // hello world! this WORLD is great. world is big!
Код (PHP): echo preg_replace_callback($preg, 'fns', $str, 1); находит все, заменяет только limit раз. какая конечная цель?
Надо найти слово которое находится на позиции от 20 и дальше и заменить его один раз, точно такие же слова которые находят до 20-й позиции не должны быть изменены, слова после произведенный замены не должны быть изменены. Задача: Входные данные: Код (Text): 'hello world! this world is great. world is big!' На выходе я должен получить: Код (Text): 'hello world! this WORLD is great. world is big!'
внезапно. Код (PHP): <?php $html = "hello world! this world is great. world is big!"; $needle = "world"; $replace = 'МИР'; $lastPos = 0; $positions = array(); $replacePos = 2; while (($lastPos = strpos($html, $needle, $lastPos)) !== FALSE) { $positions[] = $lastPos; $lastPos = $lastPos + strlen($needle); } $realPos = $replacePos - 1; if (isset($positions[$realPos])) { $html = substr_replace($html, $replace, $positions[$realPos], strlen($needle)); } echo $html; Но надо на реальной задаче прогнать, производительность протестить
Может я не совсем въехал в задачу, но может быть так? Код (PHP): function replaceFromPos($str, $reg, $repl, $pos = 0, $cnt = -1){ return substr($str, 0, $pos).preg_replace($reg, $repl, substr($str, $pos, strlen($str)), $cnt); } $text = 'hello world! this world is great. world is big!'; $pattern = '/(world)/i'; $replacement = 'WORLD'; echo replaceFromPos($text, $pattern, $replacement, 10, 1); // результат: // hello world! this WORLD is great. world is big! P.S. закинул в песочницу для тестирования
Deonis, у тебя substr_replace() с количеством замен получился А в моём случае находит позицию каждого вхождения и для n-ого вхождения заменяет Фиг его знает что в реальности требуется
Ладно, давайте так, можно как нибудь сделать так, что бы preg_replace_callback передавала в функцию еще и позицию найденного вхождения? Если да, то как. Если нет, то мне не повезло.
Ну, в общем-то, напрашивалось: Код (PHP): $str = substr($str,0,20).preg_replace('......', '......', $substr($str, 20), 1);
передача по ссылке! в лямбда-функцию!! читайте апи используемых функций!!!!!1!1!1111 я угадал что тут разговор на повышенных тонах?
нет, не угадали. Не понимаю сути, если сама функция не возвращает позицию, то каким образом что0то может помочь?