WedX - журнал о программировании и компьютерных науках

Получить числа после тире - из массива и сохранить тире в его исходном положении. регулярное выражение

Пользователь из другого потока помог мне понять, как получить числа из массива, но теперь я не могу получить числа после тире "-". Позвольте мне показать вам, что у меня есть, и поставить вас в положение.

У меня есть массив со следующим содержимым:

Array(
[0] => <tr><td>29/06/2015</td><td>19:35</td><td>12345 Column information</td><td>67899 Column information - 12</td><td>Information</td><td>More information</td></tr>
[1] => <tr><td>12/03/2015</td><td>10:12</td><td>98545 Column information</td><td>67659 Column information - 32</td><td>Information</td><td>More information</td></tr>
[2] => <tr><td>11/02/2015</td><td>12:40</td><td>59675 Column information</td><td>94859 Column information - 11</td><td>Information</td><td>More information</td></tr>
[3] => <tr><td>01/01/2015</td><td>20:12</td><td>69365 Column information</td><td>78464 Column information - 63</td><td>Information</td><td>More information</td></tr>
)

Наконец-то я знаю, как получить каждое число (кроме числа после тире "-"):

$re = "/.*?(\\d+)\\s.*?(\\d+)\\s.*/m";
$str = "<tr><td>29/06/2015</td><td>19:35</td><td>12345 Column information</td><td>67899 Column information - 12</td><td>Information</td><td>More information</td></tr>";
$subst = "$1, $2";
$result = preg_replace($re, $subst, $str);

Вот результат $; выход:

foreach($result as $finalresult) echo $finalresult.'<br>';

12345,67899
98545,67659
59675,94859
69365,78464

Чего я ожидал от всего этого процесса и не могу понять, так это получить число после тире «-»:

12345,67899-12
98545,67659-32
59675,94859-11
69365,78464-63

Но на этом это не заканчивается... когда число после тире "-" меньше 50, мне нужно преобразовать вывод $result. См. пример ниже. Если число после "-" ‹ 50, то его нужно преобразовать, взяв первую цифру и поставив ее на позицию единиц. Тогда позиция десятков может быть нулевой. Когда 50 или выше, число остается без изменений. Пример:

    12345,67899-12 ------> 12345,67899-01
    98545,67659-32 ------> 12345,67899-03
    59675,94859-11 ------> 12345,67899-01
    52375,53259-49 ------> 12345,67899-04
    69365,73464-63 ------> 12345,67899-63
    89765,12332-51 ------> 12345,67899-51
    38545,54213-70 ------> 12345,67899-70

И вот сейчас моя голова взорвется!

Заранее благодарим большое за вашу помощь.

03.03.2015

Ответы:


1

Это поможет вам:

$re = '/.*?(\d+)\s.*?(\d+)\s.*?-\s(\d+).*/';
$str = "<tr><td>29/06/2015</td><td>19:35</td><td>12345 Column information</td><td>67899 Column information - 12</td><td>Information</td><td>More information</td></tr>";
preg_match($re, $str, $matches);
if ($matches[3]<50) $matches[3] = floor($matches[3]/10);
$format = '%d,%d-%02d';
$result = sprintf($format, $matches[1], $matches[2], $matches[3]);
echo $result;

Обратите внимание, что я изменил ваш $re на одинарные кавычки вместо двойных кавычек для удобства чтения, и я использую preg_match вместо preg_replace, чтобы я мог работать с соответствующими шаблонами.

Чтобы объяснить вам регулярное выражение, происходит несколько вещей:

  • / — разделитель регулярных выражений.
  • .*?: . указывает регулярному выражению соответствовать любому символу. * говорит делать это ноль или более раз, а ? говорит делать это "ленивым" способом. Простой .* в конце $re соответствует всей остальной части строки.
  • (\d+): \d — это подстановочный знак, указывающий регулярному выражению соответствовать любой цифре. + говорит "один или несколько раз", а () говорит захватить это. Первая окруженная группа () — это $matches[1].
  • \s: является подстановочным знаком для любого символа пробела.
  • -: Буквальный символ -.
03.03.2015
  • Какой чистый код, спасибо!! У меня ошибка с preg_match и $str, потому что я использую массив. Решил это, поместив свой код внутрь foreach. Это хороший способ исправить это? вывод правильный, но я не знаю, лучший ли это способ работы с preg_match и массивами. 03.03.2015
  • Пожалуйста, не могли бы вы объяснить мне, как именно работает $re? Я пытаюсь узнать о регулярных выражениях, а не просто копировать код :) 05.03.2015
  • Регулярные выражения требуют времени, чтобы обернуться вокруг. Начните с чтения документации по PHP, чтобы действительно освоиться. из них попробуйте действующую песочницу регулярных выражений. Я добавлю объяснение $re к моему ответу. 05.03.2015
  • Еще раз спасибо, я очень благодарен. Благодаря вам я многому учусь у регулярных выражений. Я делаю хорошие успехи, изменяя ваш код для другой аналогичной задачи. Могу ли я отредактировать эту тему и спросить вас об этом, или может быть лучше создать другую тему с вопросом? 06.03.2015
  • Вы должны оставить этот решенный вопрос как у нас и задать новый вопрос в новой теме. 06.03.2015
  • Спасибо еще раз, я собираюсь создать новый :) 06.03.2015

  • 2

    Это может быть то, что вы ищете. Я немного изменил ваше регулярное выражение. (.*?<td>){3} будет соответствовать чему угодно до третьего <td>. ?P<first> в подшаблоне (?P<first>\d+) и т. д. называется именованным подшаблоном, что упрощает доступ к их значению из массива $matches.

    $a = [
        '<tr><td>29/06/2015</td><td>19:35</td><td>12345 Column information</td><td>67899 Column information - 12</td><td>Information</td><td>More information</td></tr>',
        '<tr><td>12/03/2015</td><td>10:12</td><td>98545 Column information</td><td>67659 Column information - 32</td><td>Information</td><td>More information</td></tr>',
        '<tr><td>11/02/2015</td><td>12:40</td><td>59675 Column information</td><td>94859 Column information - 11</td><td>Information</td><td>More information</td></tr>',
        '<tr><td>01/01/2015</td><td>20:12</td><td>69365 Column information</td><td>78464 Column information - 63</td><td>Information</td><td>More information</td></tr>',
    ];
    
    $result = [];
    
    foreach ($a as $row) {
        $p = '#(.*?<td>){3}(?P<first>\d+).*?</td><td>(?P<second>\d+).*?(?P<third>\d+)#';
    
        if (preg_match($p, $row, $matches)) {
            if ($matches['third'] < 50) {
                $matches['third'] = '0'.$matches['third'][0];
            }
            $result[] =
                $matches['first'] . ',' .
                $matches['second'] . '-' .
                $matches['third'];
        }
    }
    print_r($result);
    

    Выход:

    Array
    (
        [0] => 12345,67899-01
        [1] => 98545,67659-03
        [2] => 59675,94859-01
        [3] => 69365,78464-63
    )
    
    03.03.2015
  • Спасибо большое еще раз!! :) 03.03.2015

  • 3

    Что ж... не знаю, поможет ли это, но я сделал это с помощью RegExr, и он подходит правильно:

    (([0-9]+){5})|(- [0-9]{2})

    Я надеюсь, что вы можете найти это какое-то применение!

    03.03.2015
    Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]