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

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

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

 

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

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

тема: Как отсечь часть строки в скобках
 
 автор: beowulf   (18.08.2005 в 18:09)   письмо автору
 
 

Пытаюсь написать регулярное выражение, отсекающее часть строки, которая в скобках. Прим: строка(строка2). Строку 2 надо убить. Как это сделать?

   
 
 автор: Axxil   (18.08.2005 в 18:13)   письмо автору
 
   для: beowulf   (18.08.2005 в 18:09)
 

А регулярные выражения обязательны?

<?
$start_pos
=strpos($str,'(');
$end_pos =strpos($str,')');
$retstr=substr(str,0,$start_pos).substr(str,end_pos);
?>

   
 
 автор: cheops   (18.08.2005 в 21:46)   письмо автору
 
   для: beowulf   (18.08.2005 в 18:09)
 

Действительно, а почему нельзя просто найти и исключить (строка2). Для составления регулярного выражения слишком мало подробностей - так как не очень понятно, что представляет собой строка (строка2), есть ли в ней пробелы или спец-символы? Какова исходная задача?

   
 
 автор: beowulf   (19.08.2005 в 19:42)   письмо автору
 
   для: cheops   (18.08.2005 в 21:46)
 

Исходная задача такова - есть база. В базу уже внесены некие наименования, при этом, кождое из них имеет комментариий в скобках. Надо сделать так, чтобы при выводе эти комментарии не показывались. А вручную все переделывать - очень долго, поскольку база содержит тысячи наименований

   
 
 автор: isset   (19.08.2005 в 19:48)   письмо автору
 
   для: beowulf   (19.08.2005 в 19:42)
 


<?
preg_replace
("/\(.*?\)/","",$str);
?>

если надо скобки оставить то:

<?
preg_replace
("/\(.*?\)/","()",$str);
?>

   
 
 автор: cheops   (19.08.2005 в 22:09)   письмо автору
 
   для: isset   (19.08.2005 в 19:48)
 

Я конструкции .* не очень доверяю, поэтому приведу альтернативные выражения
<? 
preg_replace
("/\([^\)]+\)/","",$str); 
?>

и
<? 
preg_replace
("/\([^\)]+\)/","()",$str); 
?>

   
 
 автор: isset   (19.08.2005 в 22:18)   письмо автору
 
   для: cheops   (19.08.2005 в 22:09)
 

Почему? Есть примеры где .* работает не верно?

   
 
 автор: cheops   (19.08.2005 в 22:24)   письмо автору
 
   для: isset   (19.08.2005 в 22:18)
 

Есть, большой соблазн применить .* или .+ в предположении что регулярные выражения в "text ( text ) text ( text ) text " найдут две пары скобок, но будет найдена только одна пара первая открывающая скобка и последняя закрывающая - так как по умолчанию регулярные выражения действуют в "жадном" режиме, чтобы минимизировать расчёты. Поиск начинатеся с конца строки и как только буедет найдено соответствие (а ) и ( удовлетворяют . которая равна любому символу), поиск прекращается.

   
 
 автор: isset   (19.08.2005 в 22:35)   письмо автору
 
   для: cheops   (19.08.2005 в 22:24)
 

Для этого и стоит "?".
preg_replace("/\([^\)]+\)/","",$str);
аналогичен
preg_replace("/\(.*?\)/","",$str);

   
 
 автор: isset   (19.08.2005 в 22:49)   письмо автору
 
   для: isset   (19.08.2005 в 22:35)
 

Кстати,

<?php
$str 
'пример ( текст ) убирания () скобок';
echo 
preg_replace("/\([^\)]+\)/","",$str);
echo 
"<br>";
echo 
preg_replace("/\(.*?\)/","",$str);
?>


Результат:

пример убирания () скобок
пример убирания скобок

   
 
 автор: cheops   (19.08.2005 в 23:10)   письмо автору
 
   для: isset   (19.08.2005 в 22:49)
 

Ну так не совсем корректно сравнивать :))), ведь первое выражение можно исправить на
<?php
$str 
'пример ( текст ) убирания () скобок'
echo 
preg_replace("/\([^\)]*\)/","",$str);
?>

   
 
 автор: cheops   (19.08.2005 в 23:09)   письмо автору
 
   для: isset   (19.08.2005 в 22:35)
 

>Для этого и стоит "?".
Хитро... чего-то сразу не врубаюсь - больно закручено получается два квантификатора подряд...

   
 
 автор: isset   (19.08.2005 в 23:15)   письмо автору
 
   для: cheops   (19.08.2005 в 23:09)
 

Из мануала:

 Однако, если сразу же после квантификатора идет вопросительный знак, он перестает быть жадным и соответствует минимально допустимому количеству раз. Таким образом, шаблон /\*.*?\*/  корректно находит все комментарии языка Си. Использование символа '?' после квантификатора влияет исключительно на его жадность, и не затрагивает никакие другие свойства. Не следует путать использование символа '?' как, собственно, квантификатора (ноль либо одно соответствие) и как ограничителя жадности. Также в следствие его двойственной функциональности может использоваться следующая запись: \d??\d, которая в первую очередь соответствует одной цифре, но также может соответствовать и двум цифрам, если это необходимо для соответствия остальных частей шаблона.

   
 
 автор: cheops   (19.08.2005 в 23:22)   письмо автору
 
   для: isset   (19.08.2005 в 23:15)
 

Кошмар, теперь понятно почему я это не помню :))) наврное сразу выкинул из головы в силу сложности. Предпочитаю управлять жадностью при помощи Perl-модификатор U - это соответствующий абстрактный уровень. Помоему не совсем правильно с точки зрения интерфейса перегружать и так насыщенный знак вопроса управлением жадностью... хотя чёрт его знает, если нужно половину регулярного выражения сделать жадной, а другую наоборот, может это и выход... но знак вопроса помоему не совсем подходящий для этого символ и здорово запутывает.

   
 
 автор: isset   (19.08.2005 в 23:36)   письмо автору
 
   для: cheops   (19.08.2005 в 23:22)
 

а то я задумался чем .* плох :)
А, ну тогда можно переделать вот так:

echo preg_replace("/\(.*\)/U","",$str);

   
 
 автор: Eloim   (26.10.2005 в 15:16)   письмо автору
 
   для: isset   (19.08.2005 в 23:36)
 

Не знаю, можно ли здесь оставлять такие сообщения...
Просто хочется сказать огромное спасибо за эту ветку и вообще за замечательный форум! Все, что мне нужно для PHP я нахожу именно у вас! Спасибо!

   
Rambler's Top100
вверх

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