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
Форумы портала PHP.SU :: Версия для печати :: Регулярка, нужна помощь.
Форумы портала PHP.SU » PHP » Регулярные выражения » Регулярка, нужна помощь.

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

1. advervk - 05 Октября, 2015 - 00:12:45 - перейти к сообщению
будто|(как) будто|как бы|в качестве кого|на правах|по образу|вроде|во вкусе|в духе|что|равно как|наравне|наподобие|ровно|словно|точно|подобно ((тому) как)|чисто|(то) есть|т. е.|сиречь|точь в точь|ни дать ни взять|не хуже кого|якобы|делать за скольких|(языком|глазами) кого|для (вида|формы|проформы|блезиру|прилика)|мнимый|подобный|способ|вдруг|только|каким (образом|манером|макаром)|насколько|тем или иным способом|эк|типа|как именно|как-либо|в виде|каким манером|каким образом|совсем как|в какой мере|каким побытом|в какой степени|вот как|каким бытом|подобно как|какими судьбами|как будто|как-нибудь|вон как|до какой степени|подобно|чистый|аки|як|ик|сколько|персонаж|сколь|яко|какимобразом|каких-то|немерено|видимо-невидимо|бессчетно|полным-полно|страсть|жуть|ужас|страх|хоть|не|числа|счета|несть|без|пруд|непочатый|через|завались|по|конца-краю|навалом|полно|много|невпроворот|немало

На примере этого текста, нужно регулярное выражение, которое будет выделять все "|", кроме тех, что находятся в скобках, там они должны оставаться не тронутыми!
Необходимо для функции preg_split
Как реализовать? Плиз хелп
2. andrewkard - 05 Октября, 2015 - 10:31:55 - перейти к сообщению
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.  

хотя может есть и проще вариант...
3. DeepVarvar - 05 Октября, 2015 - 10:51:32 - перейти к сообщению
advervk, "древовидные" представления нельзя разбирать с помощью регулярок.
Тут необходим посимвольный обход строки с счетчиками сепараторов и вложенных блоков.
Т.е. начиная с первого символа ищем сепаратор, но, если ранее был найден блок с исключением (открывающая собка), то ищем закрывающую, даже если по пути будет попадаться сепаратор.

andrewkard, твой кусок дерьма отвалится на первой же аскии комбинации, а так же буквах ёЁ и вложенных скобках.
Картинка "печать переделывай".
Как сделать -- я написал выше. Исправляй.
4. Kate99 - 05 Октября, 2015 - 20:29:26 - перейти к сообщению
я согласна с DeepVarvar, необходим посимвольный обход строки, Вы так уже пробовали?
А вообще, часто в таких случаях помогают классические примеры из книг по программированию. Я в свое время разобралась в регулярках, купив себе книгу и проштудировав ее от корки до корки.
5. andrewkard - 06 Октября, 2015 - 15:08:41 - перейти к сообщению
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.  
6. Kate99 - 06 Октября, 2015 - 23:49:45 - перейти к сообщению
В книгах по программированию есть отличные примеры) Я уже три книги себе купила в интернет-магазине и изучаю и вам всем советую)

 

Powered by ExBB FM 1.0 RC1