|
|
|
| добрй день.
<?php
// в общем есть текст
$text = "start любой текст end start опять текст end";
// и есть регулярка которая вырезает и изменяет текст между start и end
$text = preg_replace("#start\s*([^end]+)\s*end#i", "$1", $text);
echo $text;
?>
|
как я могу её изменить, чтобы она не забирала, либо обрезала пробелы, но только по краям, у текста, который попадёт либо уже попал в $1? нужно это сделать именно в этом выражении...
и еще вопрос номер 2: чем отличаются выражения "#....#" и "#i....#" ?
спасибо | |
|
|
|
|
|
|
|
для: psychomc
(16.04.2010 в 16:24)
| | 1) trim()
2) модификтор i определяет независимость от регистра. И ставится он в конце выражения, а не в начале. | |
|
|
|
|
|
|
|
для: baston
(16.04.2010 в 16:31)
| | упс, извиняюсь, он туда случайно попал! я имел ввиду сами символы / / и # #
покажите плиз каким образом trim вставить можно | |
|
|
|
|
|
|
|
для: psychomc
(16.04.2010 в 16:48)
| | trim($text)
Или вы хотели, чтобы исключение пробелов было заложено в самом шаблоне?
Указанные вами символы могут служить символами-ограничителями регулярного выражения. | |
|
|
|
|
|
|
|
для: baston
(16.04.2010 в 16:51)
| | >Или вы хотели, чтобы исключение пробелов было заложено в самом шаблоне?
да, я видимо немного неправильно изложил суть изначально. в самом шаблоне нужно для каждого фрагмента.
то есть символы выполняют одну и ту же функцию? | |
|
|
|
|
|
|
|
для: psychomc
(16.04.2010 в 17:00)
| | Попробуйте такой вариант
$text = "start любой текст end start опять текст end";
// и есть регулярка которая вырезает и изменяет текст между start и end
$text = preg_replace("#(start\s)([^end]*)(\send)#i", "$2", $text);
echo "<pre>";
print_r($text);
echo "</pre>";
|
Ограничители регулярного выражения могут быть любыми, главное чтобы они не были задействованы в самом шаблоне. | |
|
|
|
|
|
|
|
для: baston
(16.04.2010 в 17:30)
| | спасибо большое, работает
я его только чуть-чуть подправил
$text = preg_replace("#(start\s*)([^end]*)(\s*end)#i", "$2", $text);
чтобы обрезал все | |
|
|
|
|
|
|
|
для: psychomc
(16.04.2010 в 16:24)
| | кагбэ по сути существует модификатор e, который после подстановки исполняет получившуюся строку как php-код. Но то ли лыжи не катят, то ли..
Так что я пользуюсь preg_replace_callback:
<?php
$text = preg_replace_callback("/start\s*([^end]+)\s*end/i",
create_function(
'$matches',
'return trim($matches[1]);'
),
$text);
|
Ну, или можно функцию отдельно создать и к ней обратить, а не create_function использовать.. | |
|
|
|
|
|
|
|
для: neadekvat
(16.04.2010 в 17:43)
| | спасибо, интересный подход.
буду дальше курить эти regexp-ы.... | |
|
|
|
|
|
|
|
для: neadekvat
(16.04.2010 в 17:43)
| | для применения модификатора e нужно иметь очень продвинутые лыжи.
Я оленьим жиром, помнится, мазал... долго и старательно. | |
|
|
|
|
|
|
|
для: Trianon
(16.04.2010 в 19:28)
| | И как, поехали? | |
|
|
|
|
|
|
|
для: neadekvat
(16.04.2010 в 19:44)
| | Отож
Наивысшая веселость там заключается в том, что тело литерала оторвано от его "кавычного" обрамления.
Ну и еще в том, что областью видимости является функция, из которой выполнен вызов preg_replace.
Что иногда неслабо так спасает. | |
|
|
|
|
|
|
|
для: Trianon
(16.04.2010 в 19:54)
| | Я тут подумал - а ведь ничего из ваших слов не понял | |
|
|
|
|
|
|
|
для: neadekvat
(16.04.2010 в 20:04)
| | Вы попробуйте preg_replace/e на примерах из мануала, постепенно усложняя задачу.
Оно поддастся наверняка. Потом усложните задачу. Еще усложните. Всё будет.
Потом попробуйте инъекцию учинить. :) | |
|
|
|
|
|
|
|
для: Trianon
(16.04.2010 в 20:11)
| | Все гениальное - просто. Спасибо =) | |
|
|
|
|
|
|
|
для: neadekvat
(16.04.2010 в 21:38)
| | Интересно, а такую строку ваше выражение найдет?
"start любой e текст end start опять e текст end" | |
|
|
|
|
|
|
|
для: big-trot
(16.04.2010 в 22:26)
| | Моих рег.выражений тут нет. | |
|
|
|
|
|
|
|
для: big-trot
(16.04.2010 в 22:26)
| | верно, не найдет. Значит, автору вопроса надо еще подумать над выражением или же воспользоваться стандартными функциями PHP. | |
|
|
|
|
|
|
|
для: baston
(17.04.2010 в 08:40)
| | Например, так:
<?php
$text = "start любой у текст е end. start опять 1, текст entropy end";
$result = array(); //массив с результатами
//Вспомогательные переменные
$start = 0;
$pos2 = 1;
//Начинаем цикл
while($pos2) //пока истинно лог.выражение
{
//Начало искомого текста
$pos1 = mb_strpos($text, "start", $start);
//Конец искомого текста
$pos2 = mb_strpos($text, "end", $pos1);
//Задаем условия, при которых продолжаем вытаскивать искомый текст
if(($pos1 > 0 && $pos2 > 0 && $start > 0) ||
($pos1 >= 0 && $pos2 > 0 && $start == 0))
{
//Заносим найденный текст в массив
$result[] = trim(mb_substr($text, $pos1 + 5, $pos2 - $pos1 - 5));
$start = $pos2 + 3;
}
else
{
//Выходим из цикла
break;
}
}
echo "<pre>";
print_r($result);
echo "</pre>";
|
| |
|
|
|
|
|
|
|
для: baston
(17.04.2010 в 10:56)
| |
// в общем есть текст
$text = "start любой текст end start опять текст end";
// и есть регулярка которая вырезает и изменяет текст между start и end
$text = preg_replace("#start((?:(?!end).)*)end#ie", "trim('$1')", $text);
|
| |
|
|
|
|
|
|
|
для: big-trot
(17.04.2010 в 18:17)
| | тема живёт :)
ваш вариант работает, но есть один момент: как мне в replacement.перед и после функции trim добавить еще произвольный текст?
что-то типа
<?php
$text = preg_replace("#start((?:(?!end).)*)end#ie", "какойто-текст trim('$1') и еще текст", $text);
|
пробовал извращаться по-разному с кавычками, но что-то как-то не удавось. спасибо
p.s я понимаю что там eval, но все-таки может есть какие-нибудь варианты... | |
|
|
|