регулярное выражение, последнее вхождение и параметры cURL - PullRequest
0 голосов
/ 18 мая 2019

Требование

Найти все случаи ...

curl_setopt($this->curlHandle, CURLOPT_URL, $url);

... и извлеките третий параметр ($ url в приведенном выше примере)

Решение (частичное)

curl_setopt\(.*?CURLOPT_URL.*?,(.*?)\)

Возвращает желаемые результаты ...

array(
 0  =>  array( 0    =>  curl_setopt($this->curlHandle, CURLOPT_URL, $url) )
 1  =>  array( 0    =>   $url )
)

... но только если каждое вхождение curl_setopt находится в отдельной строке. Э.Г.

curl_setopt($this->curlHandle, CURLOPT_HEADER, false);
curl_setopt($this->curlHandle, CURLOPT_FILE, $fileHandle);
curl_setopt($this->curlHandle, CURLOPT_URL, $url);

Проблема

Однострочная версия одного и того же кода не анализируется должным образом.

curl_setopt($this->curlHandle, CURLOPT_HEADER, false); curl_setopt($this->curlHandle, CURLOPT_FILE, $fileHandle); curl_setopt($this->curlHandle, CURLOPT_URL, $url); 

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

abc(?!.*abc)

1 Ответ

1 голос
/ 18 мая 2019

В вашем паттерне вы используете CURLOPT_URL, но в более длинной версии также есть CURLOPT_HEADER и CURLOPT_FILE, поэтому матч не остановится на этом, но будет совпадать до CURLOPT_URL, что в конце, так что вы получите более длинный матч .

Вы можете обновить свой шаблон:

curl_setopt\(.*?CURLOPT_.*?,(.*?)\)

Regex demo

Или вы можете использовать класс символов с отрицанием, чтобы сопоставить не запятую или символ новой строки, если совпадение должно быть в одной строке:

curl_setopt\([^\n,]+,\h*CURLOPT_\S+,\h*([^,\n]+)\)

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...