Регулярка с вырезкой участков строки

sanu0074

Новичок
Как составить регулярку, которая вырежет из строки в массив, куски которые встречаются в строке начинающиеся со знака "=" и заканчивающиеся на первый попавшийся пробел или конец строки?
Например есть строка "rub=12.5 и евро=18.7", из такой строки должна получится такая строка: "rub= и евро=", и такой массив array(12.5,18.7)
 

AnrDaemon

Продвинутый новичок
Регулярные выражения - это язык для описания содержимого строки.
Они ничего не вырезают! Вообще никаких операций над строкой не производят!
Для твоей задачи, попробуй
PHP:
preg_match_all('/(\p{L}+)\=(\d+(?:\.\d+))/u', $s, $ta, PREG_SET_ORDER);
 

AnrDaemon

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

sanu0074

Новичок
Я сделал так:
PHP:
preg_match_all('/(\p{L}+)\=+[^\s]/u', $str, $param, PREG_SET_ORDER);
В итоге вышло это:
Код:
array(2) {
[0]=>
array(2) {
[0]=>
string(6) "name=i"
[1]=>
string(4) "name"
}
[1]=>
array(2) {
[0]=>
string(6) "sale=u"
[1]=>
string(4) "sale"
}
}
что-то тут не так...
 

AnrDaemon

Продвинутый новичок
Регэкспы на самом деле - это ОЧЕНЬ просто.
Просто это очень компактный язык описания текста.
Тут главное - понять, как читать. Дальше всё намного проще.
 

AnrDaemon

Продвинутый новичок
Он работает :) Так, как ты его написал.
Ты же выкинул вторую группировку, вот он и не ловит то, что после =.
Исправь на
/(\p{L}+)\=(\S+)/u
 

AnrDaemon

Продвинутый новичок
Школу я и тут могу устроить. Хотел найти свой старый пост на эту тему, даже GoldEd поднял, но, видимо, не судьба.
Придётся писать с начала.

1. Управляющие последовательности:
^ - начало строки,
Код:
Пример: "^bar" совпадёт со строкой "barocco", но не с "lombard";
$ - конец строки,
Код:
Пример: "foo$" совпадёт с "kung-foo" не не с "fool";
| - "или", логическая дизъюнкция;
Код:
Пример "cat|dog" совпадёт с любой строкой, имеющей в себе "cat" или "dog" (или оба сразу);
(? … ) - модификация, все последующие правила будут применяться с учётом указанных модификаторов,
Код:
Пример: "A(?i)LARM" совпадёт с "ALARM", "Alarm" и вообще любым вариантом написания "alarm" при условии, что первая буква заглавная. (Да, именно - с "alarm"  не совпадёт!)
\ - префикс управляющей последовательности, так же экранирование других управляющих символов,
Код:
Примеров множество, многие будут рассмотрены через пару строк, тут приведу один:
  "\\" совпадёт с символом "\" (экранирует самого себя).
2. Квантификаторы (мультипликаторы):
? - "0 или 1 символ" (т.е. "этого может и не быть"),
Код:
Пример: "\.html?$" совпадёт с "file.htm" и "file.html" ("l" может отсутствовать, но это не повод не принимать имя файла);
* - "0 и больше";
+ - "1 и больше";
{min, max} - не менее min и не более max повторений; ноль можно не указывать (т.е. запись "\d{3}" вполне валидна и указывает на ровно три арабских цифры подряд);
3. Классы символов:
. - (точка) - один любой символ (один байт, либо один знак в случае многобайтового режима разбора);
\X - один символ уникода (реально один видимый символ, не важно, записан он одним кодом или комбинацией кодов); Отличие от не-уникодного "." в том, что он совпадает с переводами строки.
\w - символ слова; Очень большой класс, включающий в себя как собственно буквы, так и цифры и некоторые символы (например, подчёркивание); в зависимости от параметров компиляции библиотеки PCRE может включать в себя символы национального алфавита в однобайтной кодировке; а может и не…
\W - символ НЕ-слова; дополняющий класс для \w. Я больше не буду упоминать наличие дополняющих классов, просто имей в виду - они есть.
\p{L} - уникодный аналог \w; Дополняющий класс, соответственно \P{L};
\s - почти любые пробельные символы, в том числе символы табуляций;
\d - арабские цифры;
[ … ] - генератор класса; перечисленные в скобках символы будут объединены в класс и сравнены с каждым символом строки;
[^ … ] - отрицание, негативный класс; строка будет сравниваться с классом, составленным из символов, НЕ указанных в скобках;
4. Группировка:
( … ) - Сгруппировать и запомнить; всё, что попадёт под сравнение внутри группы, будет доступно после разбора как отдельная группа;
(?P<name> … ) - Сгруппировать и запомнить под именем; то же, но группа будет иметь читаемое имя вместо номера;
(?: … ) - Сгруппировать для сравнения; такая группировка будет действовать только на время сравнения, и никак не будет выделена в результатах; Между "?" и ":" можно писать модификаторы.
5. Собственно модификаторы:
i (PCRE_CASELESS) - наверное самый часто встречающийся - переключает чувствительность к регистру сравниваемых строк; тут необходимо иметь в виду, что не-уникодное сравнение не-ASCII строк будет работать как попало, в зависимости от платформы и настроек компилятора, которым собирали движок;
m (PCRE_MULTILINE) - указывает библиотеке, что проверяемую строку следует считать не одной, а множеством строк, разделённых символом конца строки;
s (PCRE_DOTALL) - включает режим "точка наше всё" - "." теперь включает переводы строк; (как \X)
u (PCRE_UTF8) - включает дополнительные возможности библиотеки PCRE по обработке UTF-8 строк;
x (PCRE_EXTENDED) - переводит парсер в расширенный режим: все явные пробелы игнорируются, символ "#" считается началом комментария, продолжающегося до конца строки.
P.S.
Это даже не 10% всех возможностей, но это база, которой достаточно, чтобы понять, откуда у ног растут уши.
 
Сверху