У меня есть такие строки, как constant-string-NUMBER-*
, где
constant-string-
- это константная строка (которую я знаю и могу использовать для получения ЧИСЛА), например. fix-str-
NUMBER
— любое натуральное число-*
может быть любой строкойПримеры строковых результатов:
fix-str-0
// result: 0
fix-str-0-another-str
// result: 0
fix-str-123
// result: 123
fix-str-456789
// result: 456789
fix-str-123456789-yet-another-str
// result: 1234567899
fix-str-999999-another-str-123
// result: 999999
Я хотел бы извлечь НОМЕР из этих строк в PHP, чтобы я мог связать это число с переменной, например. $numberFromString = ?
.
Любое понимание?
@SaSkY Вопрос обновлен
Один из возможных способов сделать это без регулярного выражения, основанный на ваших примерах с фиксированной строкой, - это explode
строка на -
. Если массив, возвращенный из взрыва, имеет count(array) >= 3
, используйте значение из массива [2].
5-й результат — опечатка с дополнительным 9
, верно?
Вы можете представить строку как массив символов. Используйте функцию PHP substr(), где вторым аргументом является число, от которого осталась ваша строка.
Пример. Вернуть «мир» из строки:
<?php
echo substr("Hello world",6);
?>
Информация отсюда: https://www.w3schools.com/php/func_string_substr.asp
Это решение было бы конечным. OP ищет динамическое решение и выполняет некоторую проверку ввода.
Да, согласен, лучше всегда использовать универсальное решение. Я новичок, поэтому решил предложить ответ, который знаю и который работает в данном случае!
Попробуй это:
fix-str-(\d+)
fix-str-
соответствует этой строке.(\d+)
, за которым следует одна или несколько цифр, и сохраните число в первой группе захвата.РЕДАКТИРОВАТЬ
От @user3783243 мы также можем использовать fix-str-\K\d+
без необходимости создания группы захвата.
fix-str-\K\d+
fix-str-
сопоставьте эту строку, затем..\K
сбросить начальную точку заявленного матча.\d+
затем сопоставьте одну или несколько цифр.См. демонстрацию регулярных выражений
<?php
$str = "fix-str-123456789-yet-another-str fix-str-234";
$pattern = "/fix-str-\K\d+/";
preg_match($pattern, $str, $arr1); //Find only the first match.
echo "The first match: " . $arr1[0]; //Output: 123456789
echo "\n\n\n";
preg_match_all($pattern, $str, $arr2); //Find all the matches.
echo "All the matches: " . implode(',', $arr2[0]); //Output: 123456789,234
?>
@user3783243 user3783243 Это идеальный улов, я обновлю ответ :)
Основываясь на ваших примерах строк, есть два возможных способа. Один способ может использовать explode
, тогда, конечно, другой способ может быть с preg_match
для регулярного выражения. Я покажу оба способа только для того, чтобы показать, что регулярное выражение не всегда абсолютно необходимо.
Использование explode
:
$strings = [
'fix-str-0',
'fix-str-0-another-str',
'fix-str-123',
'fix-str-456789',
'fix-str-123456789-yet-another-str',
'fix-str-999999-another-str-123',
];
$match = [];
$matches = [];
foreach ($strings as $string) {
$match = explode('-', $string);
if (count($match) >= 3) {
$matches[] = $match[2]; // Array offset 2 has the number
}
}
foreach($matches as $found) {
echo $found, PHP_EOL;
}
// Output:
0
0
123
456789
123456789
999999
Использование preg_match
:
$strings = [
'fix-str-0',
'fix-str-0-another-str',
'fix-str-123',
'fix-str-456789',
'fix-str-123456789-yet-another-str',
'fix-str-999999-another-str-123',
];
$match = [];
$matches = [];
foreach ($strings as $string) {
// match 1 or more digits, store to $match
preg_match('/(\d+)/', $string, $match);
if (!empty($match)) {
$matches[] = $match[0]; // use the first match
}
}
foreach($matches as $found) {
echo $found, PHP_EOL;
}
// Output:
0
0
123
456789
123456789
999999
Можете ли вы добавить образец строки и ожидаемый результат?