Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как в регулярке указать, что обязательно должно быть, а что не должно?
 
 автор: naxa   (13.09.2009 в 15:57)   письмо автору
 
 

допустим есть:
$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} заменить на пробел, а все остальные фигурные скобки, включая {} оставить на месте.

  Ответить  
 
 автор: cheops   (13.09.2009 в 16:08)   письмо автору
 
   для: naxa   (13.09.2009 в 15:57)
 

Если не сложно, укажите, какой результат вы ожидате от нового регулярного выражения?

  Ответить  
 
 автор: naxa   (13.09.2009 в 16:17)   письмо автору
 
   для: 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 } остались

  Ответить  
 
 автор: cheops   (13.09.2009 в 16:36)   письмо автору
 
   для: 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)
 

"'\{[^\}\{\|]*\|[^\}\{]*\}'"

  Ответить  
 
 автор: naxa   (13.09.2009 в 16:26)   письмо автору
 
   для: ...........   (13.09.2009 в 16:19)
 

то что надо, спасибо!

но всё таки - как обозначается обязательное вхождение какого-либо символа (если вдруг мне приспичит не просто заменить {...|....} на пробел, а сначала выбрать в массив, а потом заменить?

или реализовать задачу подобного типа, но уже с большим кол-вом парметров, которые должны и не должны присутствовать внутри ... ?

  Ответить  
 
 автор: naxa   (13.09.2009 в 16:34)   письмо автору
 
   для: ...........   (13.09.2009 в 16:19)
 

вот что у меня получилось:
"'{[^{][\d\w\s|]*}'si"

пойдёт ... или глупость? :)

.... а - не - глупость ... {vvv } тоже заменяет :(

  Ответить  
 
 автор: cheops   (13.09.2009 в 16:40)   письмо автору
 
   для: naxa   (13.09.2009 в 16:34)
 

Хм... помоему это не совсем то, что вам нужно - выражение сообщает, что подходит любая совпокупность чисел, пробелов и алфавитных символов, только первым не должна быть открывающая скобка. Если вы замените на "'{[\d\w\s|]*}'si" результат вряд ли изменится.

  Ответить  
 
 автор: naxa   (13.09.2009 в 16:42)   письмо автору
 
   для: cheops   (13.09.2009 в 16:40)
 

действительно :)

... мне никогда не понять эти выражения %)

  Ответить  
 
 автор: cheops   (13.09.2009 в 16:44)   письмо автору
 
   для: naxa   (13.09.2009 в 16:42)
 

>действительно :)
>
>... мне никогда не понять эти выражения %)
Они вообще сложноватенькие именно тем, что знание других языков программирования не помогает в освоении регулярных выражений - приходится с нуля их изучать, сколько бы языков до этого не знал. Но в принципе задача решаемая - нужно только на практике их почаще использовать и руки не опускать :)))

  Ответить  
 
 автор: naxa   (13.09.2009 в 16:48)   письмо автору
 
   для: 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] = '';
            }
        }

есть что-нить более научное (что-нить, что на порядок быстрее этого) ?
укажите, что здесь можно было бы ускорить - знай я регулярные выражения :)))

  Ответить  
 
 автор: cheops   (13.09.2009 в 16:55)   письмо автору
 
   для: naxa   (13.09.2009 в 16:48)
 

Не очень удобно, если будут повторяющиеся элементы - вы можете так очень много лишнего заменить, особенно если в $c попадет одна буква. А почему не хотите функцией обратного вызова воспользоваться (как указано выше) - там вы сможете любую логику прописать, не ограничиваясь синтаксисом регулярных выражений?

  Ответить  
 
 автор: naxa   (13.09.2009 в 17:13)   письмо автору
 
   для: 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);

одним выражением нельзя
заранее неизвестное колличество параметров
упаковать в массив с меняющимся колличеством элементов

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования