PHP preg_match: как работает передача переменной в preg_match? - PullRequest
1 голос
/ 15 января 2011

Это находит то, что должно:

if(!preg_match($match="/^http\/[0-9]+\\.[0-9]+[ \t]+[ \t]*(.*)\$/i",$line,$matches))

Но это не так:

if(!preg_match("/^http\/[0-9]+\\.[0-9]+[ \t]+[ \t]*(.*)\$/i",$line,$matches))

Ссылка на функцию для preg_match говорит, что первый передаваемый аргумент должен быть:*

Шаблон для поиска в виде строки.

Но приведенный выше рабочий пример присваивает шаблон переменной: $match=...

Чтоздесь происходит?Я никогда не видел переменную, используемую с preg_match, как это.Я думал, что это должно быть:

preg_match(string $regexpattern, string $thingtosearch, array $matches)

Кто-нибудь может объяснить, что здесь происходит?

Ответы [ 2 ]

3 голосов
/ 15 января 2011

В первом примере шаблон сохраняется в локальной переменной.

if(!preg_match($match="/^http\/[0-9]+\\.[0-9]+[ \t]+[ \t]*(.*)\$/i",$line,$matches))

Это эквивалентно такой записи:

$match="/^http\/[0-9]+\\.[0-9]+[ \t]+[ \t]*(.*)\$/i";   
if(!preg_match($match,$line,$matches))

Функция preg_match не "видит"что параметр был назначен переменной, он только получает значение - потому что в PHP нет параметров именованных функций.Следовательно, неважно, как вы называете локальные переменные, а определение $ param в руководстве никак не влияет на функциональность.

Вероятное объяснение этой структуры кода в том, что шаблон регулярного выражения $match может быть использован позже,Иногда это обозначение просто используется для удобства чтения.(Он поглощает область локальных переменных, но добавляет небольшую ясность.)

2 голосов
/ 15 января 2011

Выражение присваивания возвращает присвоенное значение.Таким образом, в вашем случае выражение присваивания $match="…" возвращает присвоенное значение "…", что приводит к тому же параметру для функции, что и без этого присваивания.

Выполнение этого способа полезно в некоторых случаях, например в условиииз while:

while ($row = mysql_fetch_array($result))

Здесь $row = mysql_fetch_array($result) возвращает то же значение, которое было возвращено mysql_fetch_array($result), но оно также присвоено $row.

...