Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Регулярка, нужна помощь.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
advervk
Отправлено: 05 Октября, 2015 - 00:12:45
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




будто|(как) будто|как бы|в качестве кого|на правах|по образу|вроде|во вкусе|в духе|что|равно как|наравне|наподобие|ровно|словно|точно|подобно ((тому) как)|чисто|(то) есть|т. е.|сиречь|точь в точь|ни дать ни взять|не хуже кого|якобы|делать за скольких|(языком|глазами) кого|для (вида|формы|проформы|блезиру|прилика)|мнимый|подобный|способ|вдруг|только|каким (образом|манером|макаром)|насколько|тем или иным способом|эк|типа|как именно|как-либо|в виде|каким манером|каким образом|совсем как|в какой мере|каким побытом|в какой степени|вот как|каким бытом|подобно как|какими судьбами|как будто|как-нибудь|вон как|до какой степени|подобно|чистый|аки|як|ик|сколько|персонаж|сколь|яко|какимобразом|каких-то|немерено|видимо-невидимо|бессчетно|полным-полно|страсть|жуть|ужас|страх|хоть|не|числа|счета|несть|без|пруд|непочатый|через|завались|по|конца-краю|навалом|полно|много|невпроворот|немало

На примере этого текста, нужно регулярное выражение, которое будет выделять все "|", кроме тех, что находятся в скобках, там они должны оставаться не тронутыми!
Необходимо для функции preg_split
Как реализовать? Плиз хелп

(Отредактировано автором: 05 Октября, 2015 - 00:16:44)

 
 Top
andrewkard
Отправлено: 05 Октября, 2015 - 10:31:55
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




advervk
Можно так:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $arr_out = array();
  3. $str = 'будто|(как) будто|как бы|в качестве кого|на правах|по образу|вроде|во вкусе|в духе|что|равно как|наравне|наподобие|ровно|словно|точно|подобно ((тому) как)|чисто|(то) есть|т. е.|сиречь|точь в точь|ни дать ни взять|не хуже кого|якобы|делать за скольких|(языком|глазами) кого|для (вида|формы|проформы|блезиру|прилика)|мнимый|подобный|способ|вдруг|только|каким (образом|манером|макаром)|насколько|тем или иным способом|эк|типа|как именно|как-либо|в виде|каким манером|каким образом|совсем как|в какой мере|каким побытом|в какой степени|вот как|каким бытом|подобно как|какими судьбами|как будто|как-нибудь|вон как|до какой степени|подобно|чистый|аки|як|ик|сколько|персонаж|сколь|яко|какимобразом|каких-то|немерено|видимо-невидимо|бессчетно|полным-полно|страсть|жуть|ужас|страх|хоть|не|числа|счета|несть|без|пруд|непочатый|через|завались|по|конца-краю|навалом|полно|много|невпроворот|немало';
  4. //Находим все совпадения в скобках
  5. preg_match_all('/\([а-я\s|]+\)/u',$str, $matches);
  6. //Меняем символ | в скобках на другой ^
  7. foreach($matches[0] as $match){
  8.     $str = str_replace($match,str_replace('|','^',$match),$str);
  9. }
  10. //Разбиваем строку на массив по символу |
  11. $arr_out = explode('|', $str);
  12. //Меняем символ ^ на |
  13. foreach ($arr_out as $index=>$element){
  14.     $arr_out[$index] = str_replace('^', '|', $element);
  15. }
  16. //Выводим результат
  17. print_r($arr_out);
  18.  

хотя может есть и проще вариант...
 
 Top
DeepVarvar Супермодератор
Отправлено: 05 Октября, 2015 - 10:51:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




advervk, "древовидные" представления нельзя разбирать с помощью регулярок.
Тут необходим посимвольный обход строки с счетчиками сепараторов и вложенных блоков.
Т.е. начиная с первого символа ищем сепаратор, но, если ранее был найден блок с исключением (открывающая собка), то ищем закрывающую, даже если по пути будет попадаться сепаратор.

andrewkard, твой кусок дерьма отвалится на первой же аскии комбинации, а так же буквах ёЁ и вложенных скобках.
Картинка "печать переделывай".
Как сделать -- я написал выше. Исправляй.
 
 Top
Kate99
Отправлено: 05 Октября, 2015 - 20:29:26
Post Id



Забанен


Покинул форум
Сообщений всего: 4
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




я согласна с DeepVarvar, необходим посимвольный обход строки, Вы так уже пробовали?
А вообще, часто в таких случаях помогают классические примеры из книг по программированию. Я в свое время разобралась в регулярках, купив себе книгу и проштудировав ее от корки до корки.


Отредактировано модератором: Мелкий, 06 Октября, 2015 - 15:10:01
подозрение на рекламу. Часть сообщения удалена.
 
 Top
andrewkard
Отправлено: 06 Октября, 2015 - 15:08:41
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




DeepVarvar пишет:
твой кусок дерьма отвалится на первой же аскии комбинации, а так же буквах ёЁ и вложенных скобках.

Символы можно было бы и добавить... Но код действительно получился не очень. Так лучше:
PHP:
скопировать код в буфер обмена
  1.  
  2. $arr_out = array();
  3. $str = 'вдруг|только|каким (образом|манером|макаром)|насколько';
  4. $str = iconv('utf-8','cp1251',$str);
  5. $pos = 0;
  6. $in_parenthesis = false;
  7. for ($i=0;$i<strlen($str);$i++){
  8.     if ($str[$i] == '(') $in_parenthesis = true;
  9.     if ($str[$i] == ')') $in_parenthesis = false;
  10.  
  11.     if ($in_parenthesis == false && $str[$i] == '|'){
  12.         $arr_out[] = substr($str, $pos, $i-$pos);
  13.         $pos = $i+1;
  14.     }
  15. }
  16.  
  17. print_r($arr_out);
  18.  
 
 Top
Kate99
Отправлено: 06 Октября, 2015 - 23:49:45
Post Id



Забанен


Покинул форум
Сообщений всего: 4
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




В книгах по программированию есть отличные примеры) Я уже три книги себе купила в интернет-магазине и изучаю и вам всем советую)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB