|
|
автор: ,,,,,,,, (13.09.2009 в 17:26) |
|
|
для: naxa
(13.09.2009 в 17:13)
| | незаметил что уже была функция :) | |
|
|
|
|
автор: ......... (13.09.2009 в 17:15) |
|
|
для: naxa
(13.09.2009 в 16:48)
| | cheops имеет ввиду примерно такую callback-функцию
<?
$out = array();
function bring($m) {
global $out;
$out[] = explode('|', trim($m[1]));
return '';
}
echo $text = 'd abd b a {dsf d|sad} dasb {} da d {vvv } ad asd a { asdbb sd { dsa dab bds {dd|sdad|dasda|dasd} dasd asd }'
. "\n"
. preg_replace_callback("#\{([\s\w]+(?:\|[\s\w]+)+)\}#", 'bring', $text);
print_r($out);
|
одним выражением нельзя
заранее неизвестное колличество параметров
упаковать в массив с меняющимся колличеством элементов | |
|
|
|
|
|
|
|
для: cheops
(13.09.2009 в 16:55)
| | >>Не очень удобно, если будут повторяющиеся элементы - вы можете так очень много лишнего заменить
верно ... не досмотрел ...
сейчас поразбирался с preg_replace_callback (никогда раньше не использовал) - через неё действительно удобней. спасибо :) | |
|
|
|
|
|
|
|
для: naxa
(13.09.2009 в 16:48)
| | Не очень удобно, если будут повторяющиеся элементы - вы можете так очень много лишнего заменить, особенно если в $c попадет одна буква. А почему не хотите функцией обратного вызова воспользоваться (как указано выше) - там вы сможете любую логику прописать, не ограничиваясь синтаксисом регулярных выражений? | |
|
|
|
|
|
|
|
для: cheops
(13.09.2009 в 16:44)
| | а что если так? (это чтобы сразу заменить подстроки и при этом сохранить их в массиве)
$text = "d abd b a {dsf d|sad} dasb {} da d {vvv } ad asd a { asdbb sd { dsa dab bds {dd|sdad|dasda|dasd} dasd asd }";
for($i = 0, $c = preg_match_all("'(\{[\d\w\s|]*\})'si", $text, $q); $i < $c; $i++) {
if ( strstr($q[1][$i], '|') ) {
$text = str_replace($q[1][$i], ' ', $text);
} else {
$q[1][$i] = '';
}
}
|
есть что-нить более научное (что-нить, что на порядок быстрее этого) ?
укажите, что здесь можно было бы ускорить - знай я регулярные выражения :))) | |
|
|
|
|
|
|
|
для: naxa
(13.09.2009 в 16:42)
| | >действительно :)
>
>... мне никогда не понять эти выражения %)
Они вообще сложноватенькие именно тем, что знание других языков программирования не помогает в освоении регулярных выражений - приходится с нуля их изучать, сколько бы языков до этого не знал. Но в принципе задача решаемая - нужно только на практике их почаще использовать и руки не опускать :))) | |
|
|
|
|
|
|
|
для: cheops
(13.09.2009 в 16:40)
| | действительно :)
... мне никогда не понять эти выражения %) | |
|
|
|
|
|
|
|
для: naxa
(13.09.2009 в 16:34)
| | Хм... помоему это не совсем то, что вам нужно - выражение сообщает, что подходит любая совпокупность чисел, пробелов и алфавитных символов, только первым не должна быть открывающая скобка. Если вы замените на "'{[\d\w\s|]*}'si" результат вряд ли изменится. | |
|
|
|
|
|
|
|
для: naxa
(13.09.2009 в 16:17)
| | Вероятно вам придется как-то эксплуатировать функции обратного вызова, т.е. решать заменять или оставлять, а если заменять, то на что при помощи отдельной функции, которой передаются результаты поиска. Я бы начал отталкиваться от скрипта вида
<?php
$text = "d abd b a {dsf d|sad} dasb {} da d {vvv } ad asd a { asdbb sd { dsa dab bds {dd|sdad|dasda|dasd} dasd asd }";
$text = preg_replace_callback("'\{[^}]*?\}'i", "replace", $text);
echo $text;
function replace($out)
{
// Если есть | заменяем, нет - оставляем как есть
if(strpos($out[0], "|") !== false)
{
// Если вложенная конструкция - игнорируем
if(strpos($out[1], "{") !== false) return $out[0];
else return " ";
}
else return $out[0];
}
?>
|
| |
|
|
|
|
|
|
|
для: ...........
(13.09.2009 в 16:19)
| | вот что у меня получилось:
"'{[^{][\d\w\s|]*}'si"
пойдёт ... или глупость? :)
.... а - не - глупость ... {vvv } тоже заменяет :( | |
|
|
|
|