2014-01-04 3 views
2

Я пытаюсь извлечь ID из возможно огромного текста, что я пропустил?PHP preg_match_all сбой

preg_match_all('/(ID\s\d+)/', "ID 20380843, ID ​20675712", $matches); 
print_r($matches[0]); 

Только возвращение:

Array 
(
    [0] => ID 20380843 
) 

Вместо:

Array 
(
    [0] => ID 20380843 
    [1] => ID 20675712 
) 

ответ

4

Вы скопировали эту строку из своего кода? Потому что есть что-то подлое.
Когда я скопировал код к моему редактору, он дал мне это строка:

"ID 20380843, ID ?20675712" 

Как вы можете видеть, есть Questionmark-знак в 2, таким образом, не ваше выражение :)

+0

Jebus Кристо, ты прав! У меня есть невидимые призраки UTF-8 в моем коде. Большое спасибо! – a0z0ra

+0

Я почти прочитал это сам. Рад, что я мог бы помочь – Martijn

0

print_r(matches) вместо print_r(matches[0]);

попробовать

preg_match_all('/(ID\s\d+)/', "ID 20380843, ID ​20675712", $matches); 
print_r($matches); 
+0

$ matches [0] - это список полных совпадений шаблонов для документации PHP, чего хочет OP: http://www.php.net/manual/en/function.preg-match-all.php – cincodenada

+0

2 значения одного и того же ID ... все еще не правильно :( – a0z0ra

+0

Вы оба правы. $ Matches [0] имеет два значения в вашем коде, см. Мой ответ, почему тот же код выходит из строя в его запуске :) – Martijn

2

Ваша проблема не в preg_replace_all, это ваш исходный файл. Там невидимый юникод характер во втором ID - вы можете увидеть копировать/вставить его в этот Unicode Converter, вы увидите, U + 200B появляется в различных формах в нижних ящиках:

Unicode U + шестнадцатеричный
preg_match_all ('/ (ID \ s \ d +) /', "ID 20380843, ID U + 200B^20675712", $ matches);

(курсив мой)

Это Unicode Zero-Width Spaaace, который, по-видимому, не включенных в \s, как РНР PREG определяет.

+0

Да, юникод не должен быть там! Это был оставшийся символ из недопустимого содержимого UTF-8. Спасибо за подробное объяснение! – a0z0ra