У меня есть такая строка:
some address number 23 neighborhood city
Теперь моя цель - разделить его на две части:
some address number 23
neighborhood city
Я предполагаю, что для этого потребуется комбинация команд split или preg_replace с использованием чего-то вроде этого /[^0-9]/. Как я ни старался, желаемого результата не получил.
Обновлено: есть 2 абсолютно правильных ответа: один с использованием preg_replace, а другой preg_split, удачи!
Используйте [0-9]+ для сопоставления вашего целого числа, а затем разделите после совпадения.
Пробуем, спасибо, ребята.






Вы можете использовать preg_match и группы захвата, чтобы правильно сопоставить строку.
<?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", вы можете сказать мне, как это изменить.
@DanielIliaguev Конечно, просто добавьте номер в группу захвата, я отредактировал свой ответ. Я добавлю объяснение, почему мы выбираем это регулярное выражение через секунду.
@DanielIliaguev Добавил объяснение для регулярного выражения.
Большое спасибо ! Это, безусловно, помогает понять это! Из-за вас мне трудно выбрать лучший ответ между всеми вами ... (Все они работают и подробно объяснены!)
$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) (т.е. положительный взгляд назад, а не вперед)
Вы можете использовать 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 можно использовать вот так, спасибо! Теперь трудно выбрать лучшие ответы между вами, ребята.
@DanielIliaguev, я тоже добавил объяснение регулярного выражения
@AlivetoDie, он говорит, что хочет разделить на 2 части, если есть 2 разных числовых значения, это регулярное выражение разделит его на 3 части.
@AlivetoDie есть ли разница в эффективности между preg_match и preg_split для этого случая?
@DanielIliaguev нет, совсем нет
Я бы предпочел сопоставить, чем разделить ... что-то тривиальное, например,
(.+[0-9]+)(.+), может в принципе уже сделать.