2015-08-23 2 views
-3

У меня есть строка, например:Как найти позицию каждой цифры в строке?

12abc3def4 

Как я могу получить позицию каждой отдельной цифры в этой строке с помощью регулярных выражений?

ожидается выход:

Digit: Position 
"1": 0 
"2": 1 
"3": 5 
"4": 9 

Edit:

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

preg_match('/[\d*]/', "12abc3def4", $output) 

Можно цифра не появляется более одного раза, или не появляется. Также возможно, что строка не имеет никакой цифры.

Но это только дает мне первую цифру, которая является «1», и останавливается там.

+3

1. регулярное выражение является излишеством для этого: просто «индекс символа в строке» метод будет лучше. 2. Что вы пробовали? – Richard

+0

Я думал, что regex - лучшее решение для таких проблем. Я надеялся сделать что-то вроде этого: preg_match ('/ [\ d *] /', "12abc3def4", $ output), но на выходе отображается только первая цифра «1» и игнорирование остальных. Не говоря уже о том, что я не знаю, может ли это дать мне позицию. – Lamar

+1

@Lamar Добавить ^^ этот код на свой вопрос и показать, где вы застряли – Rizier123

ответ

2

Так как вы можете access a string like an array, просто пропустите петлю через строку и, если это цифра, напечатайте позицию, например.

<?php 

    $str = "12abc3def4"; 

    echo "Digit | Position<br>"; 
    for($i = 0, $length = strlen($str); $i < $length; $i++) { 
     if(is_numeric($str[$i])) 
      echo $i . " | " . $str[$i] . "<br>"; 
    } 

?> 

выход:

Digit | Position 
    0 | 1 
    1 | 2 
    5 | 3 
    9 | 4 
+0

Спасибо, сэр :) – Lamar

+1

@Lamar Добро пожаловать. Также см. Другие ответы, которые также показывают разные способы архивирования. (BTW: Вы заметили, как upV поднимается после того, как вы показали какое-то усилие в вопросе?! <- Всегда показывайте свои усилия/попытки. Чтобы никто не чувствовал, что он просто делает для вас работу) – Rizier123

+0

Справа, получил вы :) – Lamar

3

Вы можете использовать preg_match_all с флагом PREG_OFFSET_CAPTURE

$str = "12abc3def4"; 

if(preg_match_all('/\d/', $str, $out, PREG_OFFSET_CAPTURE)!==false) 
    print_r($out[0]); 

\d соответствует цифре [0-9]; См test at eval.in

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => 0 
     ) 

    [1] => Array 
     (
      [0] => 2 
      [1] => 1 
     ) 

    [2] => Array 
     (
      [0] => 3 
      [1] => 5 
     ) 

    [3] => Array 
     (
      [0] => 4 
      [1] => 9 
     ) 

) 
+1

Просто добавьте это здесь и сделайте еще более понятным: «Первый элемент» - это «цифра», «второй элемент» - это «позиция» в subArrays. – Rizier123

+0

Мне нравятся ответы, которые демонстрируют практическое использование для менее известных функций :) –

2

Вы можете разбить строку с в массив с str_split() и фильтрует его с array_filter().

Оригинальные индексы массива, с указанием позиции каждого символа, сохраняются:

$str = '12abc3def4'; 

$filtered = array_filter(str_split($str), function($ch) { 
    return ctype_digit($ch); // return `true` for `integer` only 
}); 

print_r($filtered); 

Урожайность:

Array 
(
    [0] => 1 
    [1] => 2 
    [5] => 3 
    [9] => 4 
) 

Чтобы лучше отражать ваш пример вывода, просто var_dump(array_flip($filtered));:

Array 
(
    [1] => 0 
    [2] => 1 
    [3] => 5 
    [4] => 9 
) 

Надеюсь, что это поможет :)

Смежные вопросы