Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
 Аватар для paha444
9 / 9 / 4
Регистрация: 04.08.2013
Сообщений: 161

Написать регулярку

10.01.2015, 16:34. Показов 823. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Нужно составить регулярку из такой строки "{youtube}bBhF2l5E9-s|980|400|0{/youtube}"
На выходе нужно получить массив:
bBhF2l5E9-s
980
400
0

спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.01.2015, 16:34
Ответы с готовыми решениями:

Написать регулярку
Есть строки: Шорты мужские яркие AG-0003993 Горчичный Брюки мужские однотонные AG-0004026 Грифельный Пиджак мужской , классический...

Написать регулярку
Нужно написать регулярку <a class="otherFilmImg tooltipsy" href="http://site.ru/serial/52-bratya" title="Братья"...

Не получается написать регулярку
неполучаеться написать регулярку для сбора картинок на mail.ru нужно взять только...

15
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
10.01.2015, 17:06
Цитата Сообщение от paha444 Посмотреть сообщение
Всем привет.
PHP
1
2
3
4
5
<?php
$s = "{youtube}bBhF2l5E9-s|980|400|0{/youtube}";
preg_match("/{youtube}([^\|]+)\|([^\|]+)\|([^\|]+)\|([^\|]+){\/youtube}/", $s, $m);
foreach($m as $v)
    echo $v."<br/>\r\n";
результат
Code
1
2
3
4
5
{youtube}bBhF2l5E9-s|980|400|0{/youtube}
bBhF2l5E9-s
980
400
0
1
 Аватар для paha444
9 / 9 / 4
Регистрация: 04.08.2013
Сообщений: 161
10.01.2015, 17:25  [ТС]
Я сделал так
preg_match("!{youtube}(.*?){/youtube}!si",$string,$array_out);
$out = explode("|",$array_out[1]);
0
-72 / 10 / 4
Регистрация: 01.09.2009
Сообщений: 163
16.01.2015, 01:58
Цитата Сообщение от paha444 Посмотреть сообщение
Я сделал так
preg_match("!{youtube}(.*?){/youtube}!si",$string,$array_out);
$out = explode("|",$array_out[1]);
идеально, только почему {} не заэкранированы?
и s там не нужен по идее
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
16.01.2015, 08:19
И что же там идеального? Это называется костыль, в чистом виде. Либо тогда уж сразу писать цикл, наподобие такого
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 
$s = "{youtube}bBhF2l5E9-s|980|400|0{/youtube}";
$result = array();
for($i = 0, $j = 0, $cnt = strlen($s); $i < $cnt; ++$i)
{
    if($s[$i] === '{')
        while($i < $cnt && $s[$i++] != '}') ;
    if($i === $cnt)
        break;
    isset($result[$j]) || ($result[$j] = '');
    if($s[$i] === '|')
        ++$j;
    else
        $result[$j] .= $s[$i];
}
 
var_dump($result);
Либо использовать только регулярку, которую написал pav1uxa. А так - получается, что, в общем-то, впустую тратите ресурсы.
Цитата Сообщение от tip78 Посмотреть сообщение
почему {} не заэкранированы?
PHP видит разницу между заданием длины числом или интервалом и обычной строкой. Хотя стоит добавить любое число в любом месте внутри скобок, и сразу получим ошибку. Это такая проверка в php...
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
....
while (walk < eval_str_end) {
        /* If found a backreference.. */
        if ('\\' == *walk || '$' == *walk) {
            smart_str_appendl(&code, segment, walk - segment);
            if (walk_last == '\\') {
                code.s->val[code.s->len-1] = *walk++;
                segment = walk;
                walk_last = 0;
                continue;
            }
            segment = walk;
            if (preg_get_backref(&walk, &backref)) {
                if (backref < count) {
                    /* Find the corresponding string match and substitute it
                       in instead of the backref */
                    match = subject + offsets[backref<<1];
                    match_len = offsets[(backref<<1)+1] - offsets[backref<<1];
                    if (match_len) {
                        esc_match = php_addslashes(match, match_len, 0);
                    } else {
                        esc_match = zend_string_init(match, match_len, 0);
                    }
                } else {
                    esc_match = STR_EMPTY_ALLOC();
                }
                smart_str_appendl(&code, esc_match->val, esc_match->len);
 
                segment = walk;
 
                /* Clean up and reassign */
                zend_string_release(esc_match);
                continue;
            }
        }
        walk++;
        walk_last = walk[-1];
    }
....
static int preg_get_backref(char **str, int *backref)
{
    register char in_brace = 0;
    register char *walk = *str;
 
    if (walk[1] == 0)
        return 0;
 
    if (*walk == '$' && walk[1] == '{') {
        in_brace = 1;
        walk++;
    }
    walk++;
 
    if (*walk >= '0' && *walk <= '9') {
        *backref = *walk - '0';
        walk++;
    } else
        return 0;
 
    if (*walk && *walk >= '0' && *walk <= '9') {
        *backref = *backref * 10 + *walk - '0';
        walk++;
    }
 
    if (in_brace) {
        if (*walk == 0 || *walk != '}')
            return 0;
        else
            walk++;
    }
 
    *str = walk;
    return 1;
}
0
-72 / 10 / 4
Регистрация: 01.09.2009
Сообщений: 163
16.01.2015, 14:53
Цитата Сообщение от KOPOJI Посмотреть сообщение
И что же там идеального? Это называется костыль, в чистом виде. Либо тогда уж сразу писать цикл, наподобие такого
то что он 2мя функциями, и без циклов, разбирает строку в упорядоченный массив именно так, как нужно в ТЗ
минимум затрат, максимум отдачи.
а у вас этих функций целый огород и чё они дают, кроме гемора, я не понял.
0
 Аватар для paha444
9 / 9 / 4
Регистрация: 04.08.2013
Сообщений: 161
16.01.2015, 15:21  [ТС]
Спасибо. За отзывы. Вообще я считаю что самый правильный способ через регулярку
PHP
1
preg_match("/{youtube}([^\|]+)\|([^\|]+)\|([^\|]+)\|([^\|]+){\/youtube}/", $s, $m);
Я сделал по своему, потому что в регулярках не силен, а мне нужно было сделать это очень быстро, вот я и сделал то что мог. Был пример поиска строки, и я добавил туда только функцию разбиения на массив.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
16.01.2015, 17:19
Цитата Сообщение от tip78 Посмотреть сообщение
то что он 2мя функциями, и без циклов, разбирает строку в упорядоченный массив именно так, как нужно в ТЗ
Код pav1uxa делает это в одну строчку, в общем-то. Не нужно полное вхождение - напишите еще одну строчку. И без каких-либо циклов, раз не хотите их использовать
PHP
1
2
3
$s = "{youtube}bBhF2l5E9-s|980|400|0{/youtube}";
preg_match("/{youtube}([^\|]+)\|([^\|]+)\|([^\|]+)\|([^\|]+){\/youtube}/", $s, $out);
array_shift($out);
Цитата Сообщение от tip78 Посмотреть сообщение
а у вас этих функций целый огород
Если быть точным, то всего лишь две. Притом непосредственно к самому коду обработчика относится лишь одна - strlen. Да и то, можно обойтись и без нее - она лишь для удобства восприятия. Вторая функция - var_dump() и она используется лишь для вывода результата для просмотра. isset - это языковая конструкция, а не функция. Предупреждая возможные слова о том, что это функция:
Цитата Сообщение от http://php.net/manual/en/function.isset.php
Note: Because this is a language construct and not a function, it cannot be called using variable functions.
array() - это тоже языковая конструкция. Все остальное (while, break, for, if) тоже.
Цитата Сообщение от tip78 Посмотреть сообщение
и чё они дают, кроме гемора, я не понял
Печально, что такой простой алгоритм вы не смогли понять. Впрочем, не думаю, что его будут использовать, поэтому не важно - кому надо, тот разберется.
Цитата Сообщение от paha444 Посмотреть сообщение
Вообще я считаю что самый правильный способ через регулярку
Раз так считаете - значит, для вас он самый правильный
0
-72 / 10 / 4
Регистрация: 01.09.2009
Сообщений: 163
16.01.2015, 17:47
Цитата Сообщение от KOPOJI Посмотреть сообщение
Печально, что такой простой алгоритм вы не смогли понять. Впрочем, не думаю, что его будут использовать, поэтому не важно - кому надо, тот разберется.
печально не то, что меня этот алгоритм испугал, как альтернатива той простоте, что выше, а то, что вы всерьёз это называете "двумя функциями":
Цитата Сообщение от KOPOJI Посмотреть сообщение
<?php
$s = "{youtube}bBhF2l5E9-s|980|400|0{/youtube}";
$result = array();
for($i = 0, $j = 0, $cnt = strlen($s); $i < $cnt; ++$i)
{
if($s[$i] === '{')
while($i < $cnt && $s[$i++] != '}') ;
if($i === $cnt)
break;
isset($result[$j]) || ($result[$j] = '');
if($s[$i] === '|')
++$j;
else
$result[$j] .= $s[$i];
}
var_dump($result);
1 for, 1 while, 3 if, 1 strlen
+ заполнение массива, вычисления, вычисления, вычисления...

и да, я не очень понимаю такие вот конструкции:
PHP
1
2
if($s[$i] === '{')
while($i < $cnt && $s[$i++] != '}') ;
почему после while() стоит ;, а не {}
опять какая-то пхп-магия?
или
Цитата Сообщение от KOPOJI Посмотреть сообщение
isset($result[$j]) || ($result[$j] = '');
в голом виде...
толку от неё? должна быть в проверке хотя бы

и ещё стиль ппц - ни {}, ни endif
быдлокод какой-то с рассчётом на то, что его больше никогда не придётся открывать и разбирать
надеюсь реальные приложения вы пишите более продуманно.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
16.01.2015, 17:58
Цитата Сообщение от tip78 Посмотреть сообщение
всерьёз это называете "двумя функциями"
Ну давайте я назову шутливо. Все равно факт остается фактом: используется лишь две функции, и только одна непосредственно в "вычислениях".
Цитата Сообщение от tip78 Посмотреть сообщение
да, я не очень понимаю такие вот конструкции
К чему тогда подобные словоизлияния, если вы не понимаете простой конструкции?
Если текущий символ равен { - т.е., открывающая фигурная скобка, то запускаем цикл и пропускаем все символы, пока не встретим закрывающий символ } или пока не дошли до конца строки. Можно было и явно указывать youtube, но я поленился - тем более, что пример, по большей части, был чисто ознакомительным, написанным "на коленке".
Цитата Сообщение от tip78 Посмотреть сообщение
почему после while() стоит ;, а не {}
опять какая-то пхп-магия?
Представьте, это не магия, а обычный синтаксис. Пустое тело цикла можно опустить, заменив символом конца инструкции - т.е., точкой с запятой. Это еще из Си.
Цитата Сообщение от tip78 Посмотреть сообщение
в голом виде...
Да хоть в одетом..
Цитата Сообщение от tip78 Посмотреть сообщение
толку от неё? должна быть в проверке хотя бы
Наверное, если я ее написал, то есть от нее толк? В данном случае это равнозначно написанию if-a, но я решил так написать.
Цитата Сообщение от tip78 Посмотреть сообщение
и ещё стиль ппц - ни {}, ни endif
А я не считаю необходимыми лепить их где ни попадя
Цитата Сообщение от tip78 Посмотреть сообщение
быдлокод какой-то
Из-за стиля - быдлокод?
Открою маленькую тайну: в том же питоне вообще не используются операторные скобки в качестве выделения тела цикла/условия - там используются отступы. В моем коде используется абсолютно тоже самое.
И сначала ознакомьтесь нормально с синтаксисом PHP, прежде чем говорить о том, что то, чего вы не понимаете - быдлокод..
0
-72 / 10 / 4
Регистрация: 01.09.2009
Сообщений: 163
16.01.2015, 18:11
Цитата Сообщение от KOPOJI Посмотреть сообщение
Представьте, это не магия, а обычный синтаксис. Пустое тело цикла можно опустить, заменив символом конца инструкции - т.е., точкой с запятой. Это еще из Си.
да я уже понял, что плодить пустые циклы для вас "обычный синтаксис"
Цитата Сообщение от KOPOJI Посмотреть сообщение
Наверное, если я ее написал, то есть от нее толк?
ага, толк очевиден - можно потом ещё простыню текста вывалить про то, что if можно писать с {}, а можно и без них
а то ж никто не знает
вопрос был о том, что вы навставляли циклов БЕЗ смысла и содержания, чем лишь нагрузили процессор, а задача решалась элегантно, двумя строками, как в примере выше.
подозреваю, следующая простыня будет про то, что можно переносить строки, а можно не переносить?
0
16.01.2015, 18:12

Не по теме:

Цитата Сообщение от tip78 Посмотреть сообщение
можно потом ещё простыню текста вывалить про то
Вываливайте что хотите. Только хоть прикройте потом..

0
 Аватар для paha444
9 / 9 / 4
Регистрация: 04.08.2013
Сообщений: 161
16.01.2015, 19:48  [ТС]
Мне интересно, сколько потратится ресурсов так:

PHP
1
2
preg_match("!{youtube}(.*?){/youtube}!si",$string,$array_out);
$out = explode("|",$array_out[1]);
и так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$s = "{youtube}bBhF2l5E9-s|980|400|0{/youtube}";
$result = array();
for($i = 0, $j = 0, $cnt = strlen($s); $i < $cnt; ++$i)
{
if($s[$i] === '{')
while($i < $cnt && $s[$i++] != '}') ;
if($i === $cnt)
break;
isset($result[$j]) || ($result[$j] = '');
if($s[$i] === '|')
++$j;
else
$result[$j] .= $s[$i];
}
var_dump($result);
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
16.01.2015, 20:11
В данном случае первый вариант будет лучше, т.к. там подобный цикл выполняется в коде на Си в сорцах, что намного быстрее и "чище" пыха
Повторюсь, код приведен лишь для примера - изначально я советовал использовать код pav1uxa.
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
16.01.2015, 21:02
paha444, как вариант, если строка имеет вид такой, как вы показали и не требуется дополнительный её поиск в каком-то общем контексте, можно использовать preg_split. В этом случае, не важно количество частей, разделённых символом "|".
PHP
1
2
$str = '{youtube}bBhF2l5E9-s|980|400|0{/youtube}';
$parts = preg_split('/[{\/youtube}\|]/',$str,-1, PREG_SPLIT_NO_EMPTY);
Результат:
PHP
1
2
3
4
5
6
7
Array
(
    [0] => BhF2l5E9-s
    [1] => 980
    [2] => 400
    [3] => 0
)
Добавлено через 6 минут
Стоп! Беру свои слова обратно! Глупость написал Так делать нельзя. Но пусть останется, чтоб другие не повторили ошибку.

Добавлено через 40 минут
UPD Реабилитируюсь
PHP
1
2
$parts = preg_split('/({\/?youtube})|[\|]/',$str,-1,PREG_SPLIT_NO_EMPTY);
print_r($parts);
1
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
16.01.2015, 21:10
А зачем youtube и слэш в скобки?
PHP
1
'/{\/?youtube}|\|/'
Тоже самое же будет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.01.2015, 21:10
Помогаю со студенческими работами здесь

как правильно написать регулярку
есть строка $text=&quot;заказ на сумму 2000 готов к отправке. номер заказа 123648976346&quot; как правильно написать регулярку чтобы получить...

Немогу написать регулярку для cURL
Есть html строка: &lt;a href=&quot;showthread.php?t=111&quot; id=&quot;thread_title_111&quot; style=&quot;font-weight:bold&quot;&gt;Текст&lt;/a&gt; Помогите выдрать слово...

Как написать регулярку для вырезания следующего
Здравствуйте, нужно из ответных заголовков сервера вырезать следующее. Вот что приходит: HTTP/1.1 302 Found Date: Sun, 12 Oct 2014...

Помогите написать регулярку
буквы (a-z) цыфры (0-15) Разрешенные специальные символы .-_()

Инвертировать регулярку
Есть папка wa-config нужно исключить из игнора файлы plugins.php но все остальные файлы добавить. Выбераю все файлы plugins.php. Нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru