Регулярное совпадение с адресом ma c без кавычек - PullRequest
2 голосов
/ 14 апреля 2020

Я пытаюсь понять, почему приведенная ниже функция возвращает странные результаты

<?
$string = "001122334 001122334455 0011 0011223344556677";
preg_match_all('/([a-fA-F0-9]){12}/', $str, $matches);
?>

Я не понимаю, почему 001122334455 появляется дважды и почему 5 5 делает это. Я ищу, чтобы найти МА C Адрес без совпадения с полуколоннами

Вывод

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

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

Ответы [ 2 ]

3 голосов
/ 14 апреля 2020

Ваше регулярное выражение

  • содержит группу повторных захватов , ([a-fA-F0-9]){12}, то есть шестнадцатеричный символ захватывается в группу, а затем значение группы переписывается в 11 раз больше (всего 12 раз), поэтому последний захваченный шестнадцатеричный символ попадает во второй подрешетку (в каждом совпадении, которое вы получаете со своей входной строкой, это 5, таким образом, у вас есть два 5 s во втором массиве).
  • не привязан с обеих сторон, поэтому он находится в любом месте строки, поэтому вы получаете два совпадения, 001122334455 сопоставляется и 001122334455 in 0011223344556677 также сопоставляется.

Снимите скобки захвата и используйте шаблон сопоставления целых слов, например

# Word boundaries
preg_match_all('/\b[a-fA-F0-9]{12}\b/', $str, $matches)            
# Whitespace boundaries
preg_match_all('/(?<!\S)[a-fA-F0-9]{12}(?!\S)/', $str, $matches)   
# Hex char boundaries
preg_match_all('/(?<![a-fA-F0-9])[a-fA-F0-9]{12}(?![a-fA-F0-9])/', $str, $matches) 

См. Демонстрационную версию PHP 1023 *

0 голосов
/ 14 апреля 2020

Я думаю, что вы должны проанализировать конец значения.

$string = "001122334 001122334455 0011 0011223344556677";
preg_match_all('/([a-fA-F0-9]){12}\ /', $string, $matches);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...