Разделенная строка PHP до и после целого числа внутри

У меня есть такая строка:

some address number 23 neighborhood city

Теперь моя цель - разделить его на две части:

  1. some address number 23

  2. neighborhood city

Я предполагаю, что для этого потребуется комбинация команд split или preg_replace с использованием чего-то вроде этого /[^0-9]/. Как я ни старался, желаемого результата не получил.

Обновлено: есть 2 абсолютно правильных ответа: один с использованием preg_replace, а другой preg_split, удачи!

Я бы предпочел сопоставить, чем разделить ... что-то тривиальное, например, (.+[0-9]+)(.+), может в принципе уже сделать.

CBroe 18.05.2018 10:41

Используйте [0-9]+ для сопоставления вашего целого числа, а затем разделите после совпадения.

Spencer Wieczorek 18.05.2018 10:41

Пробуем, спасибо, ребята.

Daniel Iliaguev 18.05.2018 10:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
245
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать preg_match и группы захвата, чтобы правильно сопоставить строку.

https://3v4l.org/K1IK4

<?php

$string = "some address number 23 neighborhood city";

preg_match("/([^\d]*\d*)(.*)$/", $string, $matches);
var_dump($matches);

array(3) {
    [0]=>
    string(40) "some address number 23 neighborhood city"
    [1]=>
    string(20) "some address number 23"
    [2]=>
    string(18) " neighborhood city"
}

Обновлено:

В регулярном выражении мы хотим достичь того, чего хотим, с наименьшими возможными шагами.

Это наше регулярное выражение: https://regex101.com/r/rihbWM/2, и мы видим, что оно требует шагов 9, что неплохо.

1st Capturing Group ([^\d]\d)

Match a single character not present in the list below [^\d]* This is performance-wise better than .*\d because .*\d matches the whole string - then has to jump back to the decimal which is worse performance-wise.

  • Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)

\d matches a digit (equal to [0-9])

\d* matches a digit (equal to [0-9])

  • Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)

2nd Capturing Group (.*)

.* matches any character (except for line terminators)

  • Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)

$ asserts position at the end of the string, or before the line terminator right at the end of the string (if any)

Спасибо, но две вещи. Не могли бы вы объяснить, как вы решили использовать "/([^\destive*)\d*(.*)$/"? Я действительно хотел бы понять эту часть ... Во-вторых, он удаляет число из строки, посмотрите на пример, мне нужно, чтобы это был "какой-то адрес 23", вы можете сказать мне, как это изменить.

Daniel Iliaguev 18.05.2018 10:53

@DanielIliaguev Конечно, просто добавьте номер в группу захвата, я отредактировал свой ответ. Я добавлю объяснение, почему мы выбираем это регулярное выражение через секунду.

Xatenev 18.05.2018 10:56

@DanielIliaguev Добавил объяснение для регулярного выражения.

Xatenev 18.05.2018 11:02

Большое спасибо ! Это, безусловно, помогает понять это! Из-за вас мне трудно выбрать лучший ответ между всеми вами ... (Все они работают и подробно объяснены!)

Daniel Iliaguev 18.05.2018 11:05
$example = preg_split('/(?<=\d\D)/', 'some address number 23 neighborhood city', 2);

var_dump($example);


array(2) {   
[0]=>   string(20) "some address number 23 "   
[1]=> string(20) "neighborhood city" }

Это определенно лучший вариант, но он ставит 23 не на ту сторону. Я думаю, вам может понадобиться что-то вроде (?<=\d\D) (т.е. положительный взгляд назад, а не вперед)

iainn 18.05.2018 10:58
Ответ принят как подходящий

Вы можете использовать preg_split () с флагами (PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY)

<?php
$word= "some address number 23 neighborhood city";
$keywords = preg_split("/(.+[0-9]+)(.+)/", $word,-1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($keywords);

Выход: -https://eval.in/1006421

Объяснение:-

/(.+[0-9]+)(.+)/

    1st Capturing Group (.+[0-9]+)

        .+ matches any character (except for line terminators)
            + Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)

        Match a single character present in the list below [0-9]+

            + Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
            0-9 a single character in the range between 0 (index 48) and 9 (index 57) (case sensitive)

    2nd Capturing Group (.+)
        .+ matches any character (except for line terminators)
        + Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)

Круто, не знал, что preg_split можно использовать вот так, спасибо! Теперь трудно выбрать лучшие ответы между вами, ребята.

Daniel Iliaguev 18.05.2018 10:58

@DanielIliaguev, я тоже добавил объяснение регулярного выражения

WM-SH-PD-TV-FC 18.05.2018 11:01

@AlivetoDie, он говорит, что хочет разделить на 2 части, если есть 2 разных числовых значения, это регулярное выражение разделит его на 3 части.

Anar Bayramov 18.05.2018 11:05

@AlivetoDie есть ли разница в эффективности между preg_match и preg_split для этого случая?

Daniel Iliaguev 18.05.2018 11:11

@DanielIliaguev нет, совсем нет

WM-SH-PD-TV-FC 18.05.2018 11:12

Другие вопросы по теме