preg_match_all обеспечивает отличные/уникальные результаты

Я использую следующий код для сопоставления всех переменных в сценарии, начинающихся с «$», однако я хотел бы, чтобы результаты не содержали дубликатов, т. е. были разными/уникальными:

preg_match_all('/\$[a-zA-Z0-9]+/', $code, $variables);

Любой совет?


person Gavin    schedule 16.02.2010    source источник


Ответы (3)


Используйте array_unique, чтобы удалить дубликаты из выходного массива:

preg_match_all('/\$[a-zA-Z0-9]+/', $code, $variables);
$variables = array_unique($variables[0]);

Но я надеюсь, что вы не пытаетесь разобрать PHP с помощью этого. Используйте token_get_all, чтобы получить токены данного PHP-кода.

person Gumbo    schedule 16.02.2010
comment
Я согласен, что это самое простое решение, хотя мне любопытно, есть ли способ сделать это в регулярном выражении, чтобы не превращать этот метод O (1) в O (N)... - person icco; 16.02.2010
comment
@icco: я не уверен, как реализовано array_unique. Но я предполагаю, что они используют хеш-таблицу для поиска. А это означает O(1). - person Gumbo; 16.02.2010
comment
Ура, я видел эту функцию php, но не заметил, что мне нужно [0] из-за большого набора результатов. Дох! Я использую это, чтобы запутать JS, поскольку компилятор закрытия Google не позволяет использовать некоторые методы кодирования в js, которые у меня есть в расширенном режиме. А именно использование this в статических методах. - person Gavin; 16.02.2010
comment
@icco, конечно, вы могли бы сделать это в регулярном выражении, но заглядывание вперед превратит это в кошмар (с точки зрения производительности). Это должно сделать это: (\$[a-zA-Z0-9]+)(?!.*\1). Кроме того, переменные будут отображаться в обратном порядке в массиве $variables. - person Bart Kiers; 17.02.2010

Не делайте этого с регулярным выражением. После того, как вы собрали их все в своем $variables, просто отфильтруйте их, используя обычную логику/операции программирования. Например, используя array_unique, как упоминал Гамбо.

Кроме того, что будет делать ваше регулярное выражение в этих случаях:

// this is $not a var
foo('and this $var should also not appear!');
/* and what about $this one? */

Все три «переменные» ($not, $var и $this) не являются переменными, но будут соответствовать вашему регулярному выражению.

person Bart Kiers    schedule 16.02.2010
comment
Спасибо за ответ, но в моем случае это не проблема. Мой код используется для запутывания JS перед его упаковкой (что удаляет комментарии), и в строках нет экземпляров $. - person Gavin; 17.02.2010
comment
Хорошо, приятно это слышать, тогда вы можете смело использовать preg_match_all. Я подумал, что это стоит упомянуть на всякий случай. - person Bart Kiers; 17.02.2010

Попробуйте следующий код:

preg_match_all('/\$[a-zA-Z0-9]+/', $code, $variables);
$variables = array_unique($variables);
person pako    schedule 16.02.2010