Разбиение строки по массиву паттернов

young

Новичок
Разбиение строки по массиву паттернов

Попробую объяснить:

Есть массив паттернов, вида:

* http://www.
* https://www.
* .com
* .org
* www.
* blababla
* coolstring

Есть строка "cool string www.blax.com and som https://www.1.com"

Требуется разбить строку на вхождения паттернов и остальные части строки. Причем если подходят несколько паттернов - надо брать максимально длинный. На выходе для приведенной строки должно быть:

1) строка cool string
2) паттерн "www."
3) строка blax
4) паттерн ".com"
4) строка som
5) паттерн "https://www."
6) строка 1
7) паттерн ".com"

Единственное что приходит в голову: по цилку через strpos искать первое вхождение, обрабатывать его, отрезать, и опять по циклу через strpos искать следующее вхождение.

Может есть решение лучше?
 

Oleg Marchuk

Человек
Единственное что приходит в голову: по цилку через strpos искать первое вхождение, обрабатывать его, отрезать, и опять по циклу через strpos искать следующее вхождение.
Я бы так и сделал, но предварительно отсортировав массив паттернов по длине для
Причем если подходят несколько паттернов - надо брать максимально длинный
 

Demiurg

Guest
/.*(pattern1|patrn2|pat3)/sU
паттерны в порядке убывания длинны, за эскеёпленые естественно.

все это в preg_match_all, не уверен, что получиться, просто идея.
 

young

Новичок
паттерны заданы строго, но их порядка несколько сот
При средней длине 4 символа, длина регулярки ~600 символов, она не будет тормозить?

И этот алгоритм будет гарантировать, что будет взято наибольшее вхождение?
Ибо в строке
http://www.a.com
Есть паттерны
http:// и http:/www
 

Demiurg

Guest
> она не будет тормозить?
потестируй :) не думаю, что будет тормозить сильнее кучи phpшных циклов.

>И этот алгоритм будет гарантировать, что будет взято наибольшее вхождение?
тут надо подробнее разбираться с движком pcre. На сколько я его понимаю, гарантия есть.
 

Oleg Marchuk

Человек
она не будет тормозить?
Будет. Мы тут обсуждали достаточно простую задачу, которая касается регекспов. Вот пример, оцени сам.

И этот алгоритм будет гарантировать, что будет взято наибольшее вхождение?
Будет. pcre так работает, он всегда находит наибольшее совпадение. Именно для избежания этого придумали конструкцию типа '/.*?/'
 

Demiurg

Guest
>Будет. pcre так работает, он всегда находит наибольшее совпадение.
Посмотри внимательно на модификаторы, которые я написал.
 

Demiurg

Guest
Oleg Marchuk, здесь речь идет не о простом вырезании строки, так что понятие "тормозить" - здесь относительно. Если считаешь, что будет, предложи свой вариант.
 

Oleg Marchuk

Человек
Да, не заметил. Модификатор "U" явно лишний. Нас же максимальные строки интересуют. С другой стороны preg_match_all вернет все найденые строки.
 

Blindman

Новичок
PHP:
$p='~(http://www\.|https://www\.|www\.|\.com|\.org|blababla|coolstring)~';
$s="cool string www.blax.com and som https://www.1.com";
$a=preg_split($p,$s,-1,PREG_SPLIT_DELIM_CAPTURE);
Порядок выбора паттернов, разделенных палкой, определяется порядком их следования, а не режимом greedy/ungreedy. Поэтому длинные паттерны в начало регэкспа, короткие-в конец.
 

Demiurg

Guest
> Нас же максимальные строки интересуют.
он там стоит не для этого, а для того, что бы мы не получили одно совпаджение в коце строки, вместо всех.

Blindman, тоже вариант.
 
Сверху