Я использую 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();
В режиме по умолчанию preg_match_all
возвращает массив совпадений и подматричек:
PREG_PATTERN_ORDER
Заказывает результаты, так что$matches[0]
представляет собой массив совпадений полного шаблона,$matches[1]
– это массив строк, совпадающих с первым подшаблотелем в скобках и т. Д.
Таким образом, в этом случае первый массив представляет собой массив совпадений всего шаблона, а второй массив представляет собой массив совпадений первого подшаблона. И так как совпадения не найдено, оба массива пустые.
Если вы хотите другой порядок, имея каждое соответствие в массиве с его PREG_SET_ORDER
, используйте параметр PREG_SET_ORDER
в параметре flags :
preg_match_all("/(#\w+)/", $tweet, $tags, PREG_SET_ORDER);
Вы получаете две пустые массивы, потому что вы соответствуете выражению и подвыражению. Ваши ожидаемые результаты на самом деле являются ошибкой здесь. Проверьте руководство , в частности описание поведения по умолчанию, когда флаги не передаются в четвертом аргументе:
Заказывает результаты, так что $ matches [0] представляет собой массив совпадений полного шаблона, $ matches 1 – это массив строк, совпадающих с первым подшаблотелем в скобках и т. Д.
Вы всегда получаете многомерный массив из preg_match_all, если вы не передадите PREG_OFFSET_CAPTURE
в качестве аргумента флага. В этом случае вы должны фактически получить пустой массив для выражения, которое не соответствует чему-либо.