получение результатов пустого массива с использованием preg_match_all для значений, которые не совпадают - PullRequest
2 голосов
/ 28 сентября 2010

Я использую preg_match_all для поиска значений HashTag в ответе на поиск в Twitter.

Это работает так, как я ожидал, за исключением случаев, когда в результатах поиска нет хеш-значений. По некоторым причинам у моего массива $ tags все еще есть значения, и я не уверен почему.

Это потому, что мой RegEx неверен, или это проблема с preg_match_all?

Спасибо

$tweet = "Microsoft Pivot got Runner-Up for Network Tech from The Wall Street Journal in 2010 Technology Innovation Awards  http://bit.ly/9pCbTh";

private function getHashTags($tweet){
    $tags = array();
    preg_match_all("/(#\w+)/", $tweet, $tags);

    return $tags;

}

Результат:

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

Ожидаемые результаты:

Array();

Ответы [ 2 ]

4 голосов
/ 28 сентября 2010

В режиме по умолчанию preg_match_all возвращает массив совпадений и подсовпадений:

PREG_PATTERN_ORDER
Заказывает результаты, так что $matches[0]является массивом полных совпадений с образцом, $matches[1] является массивом строк, сопоставленных первым заключенным в скобки подшаблоном, и т. д.

Так что в этом случае первый массив является массивом совпаденийвесь шаблон, а второй массив - это массив совпадений первого подшаблона.А поскольку совпадений не найдено, оба массива пусты.

Если вы хотите другой порядок, для которого каждое совпадение в массиве имеет свои подспряжения, используйте PREG_SET_ORDER в параметре flags :

preg_match_all("/(#\w+)/", $tweet, $tags, PREG_SET_ORDER);
1 голос
/ 28 сентября 2010

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

Упорядочивает результаты так, что $ совпадения [0] - это массив полных совпадений с образцами, $ совпадения 1 - это массив строк, сопоставленных с первым подшаблоном в скобках и т.

Вы всегда получаете многомерный массив из preg_match_all, если только вы не передаете PREG_OFFSET_CAPTURE в качестве аргумента флага. В этом случае вы должны получить пустой массив для выражения, которое ничего не соответствует.

...