|
|
|
| допустим есть:
$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("'{[^}]*?}'i", ' ', $text);
резултат: d abd b a dasb da d ad asd a dasd asd }
как указать, что после { обязательно должен быть символ |, а если после { встречается ещё одна {, то пропустить? ...
в идеале - должно только {dsf d|sad} и {dd|sdad|dasda|dasd} заменить на пробел, а все остальные фигурные скобки, включая {} оставить на месте. | |
|
|
|
|
|
|
|
для: naxa
(13.09.2009 в 15:57)
| | Если не сложно, укажите, какой результат вы ожидате от нового регулярного выражения? | |
|
|
|
|
|
|
|
для: cheops
(13.09.2009 в 16:08)
| | '{[^>{]*?}'si
так - это то, что позволит исключить {, как задать, чтобы обязательно | присутствовало?
*
в идеале должно получится вот так:
d abd b a dasb {} da d {vvv } ad asd a { asdbb sd { dsa dab bds dasd asd }
'{[^>{]*?}'si - вот это заменяет на пробел скобки, в которых нет |, но мне нужно, чтобы {} и {vvv } остались | |
|
|
|
|
|
|
|
для: 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) |
|
|
для: naxa
(13.09.2009 в 15:57)
| |
"'\{[^\}\{\|]*\|[^\}\{]*\}'"
|
| |
|
|
|
|
|
|
|
для: ...........
(13.09.2009 в 16:19)
| | то что надо, спасибо!
но всё таки - как обозначается обязательное вхождение какого-либо символа (если вдруг мне приспичит не просто заменить {...|....} на пробел, а сначала выбрать в массив, а потом заменить?
или реализовать задачу подобного типа, но уже с большим кол-вом парметров, которые должны и не должны присутствовать внутри ... ? | |
|
|
|
|
|
|
|
для: ...........
(13.09.2009 в 16:19)
| | вот что у меня получилось:
"'{[^{][\d\w\s|]*}'si"
пойдёт ... или глупость? :)
.... а - не - глупость ... {vvv } тоже заменяет :( | |
|
|
|
|
|
|
|
для: naxa
(13.09.2009 в 16:34)
| | Хм... помоему это не совсем то, что вам нужно - выражение сообщает, что подходит любая совпокупность чисел, пробелов и алфавитных символов, только первым не должна быть открывающая скобка. Если вы замените на "'{[\d\w\s|]*}'si" результат вряд ли изменится. | |
|
|
|
|
|
|
|
для: cheops
(13.09.2009 в 16:40)
| | действительно :)
... мне никогда не понять эти выражения %) | |
|
|
|
|
|
|
|
для: naxa
(13.09.2009 в 16:42)
| | >действительно :)
>
>... мне никогда не понять эти выражения %)
Они вообще сложноватенькие именно тем, что знание других языков программирования не помогает в освоении регулярных выражений - приходится с нуля их изучать, сколько бы языков до этого не знал. Но в принципе задача решаемая - нужно только на практике их почаще использовать и руки не опускать :))) | |
|
|
|
|
|
|
|
для: 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:48)
| | Не очень удобно, если будут повторяющиеся элементы - вы можете так очень много лишнего заменить, особенно если в $c попадет одна буква. А почему не хотите функцией обратного вызова воспользоваться (как указано выше) - там вы сможете любую логику прописать, не ограничиваясь синтаксисом регулярных выражений? | |
|
|
|
|
|
|
|
для: cheops
(13.09.2009 в 16:55)
| | >>Не очень удобно, если будут повторяющиеся элементы - вы можете так очень много лишнего заменить
верно ... не досмотрел ...
сейчас поразбирался с preg_replace_callback (никогда раньше не использовал) - через неё действительно удобней. спасибо :) | |
|
|
|
|
автор: ,,,,,,,, (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);
|
одним выражением нельзя
заранее неизвестное колличество параметров
упаковать в массив с меняющимся колличеством элементов | |
|
|
|