diff --git a/core/UrlHelper.php b/core/UrlHelper.php index 66a0e64e2530db9e82bc553bf6b5c629a99a8a7e..ae4f3c622dd6794a5b73d119166b533ab387f6e2 100644 --- a/core/UrlHelper.php +++ b/core/UrlHelper.php @@ -17,6 +17,32 @@ use Piwik\Intl\Data\Provider\RegionDataProvider; */ class UrlHelper { + + /** + * Checks if a string matches/is equal to one of the patterns/strings. + * + * @static + * @param $test String to test. + * @param $patterns Array of strings or regexs. + * + * @return true if $test matches or is equal to one of the regex/string in $patterns, false otherwise. + */ + protected static function in_array_reg($test, $patterns) + { + foreach($patterns as $val) { + if(@preg_match($val, null) === false) { + if( strcasecmp($val, $test) === 0 ) { + return true; + } + } else { + if( preg_match($val, $test) === 1 ) { + return true; + } + } + } + return false; + } + /** * Converts an array of query parameter name/value mappings into a query string. * Parameters that are in `$parametersToExclude` will not appear in the result. @@ -36,7 +62,7 @@ class UrlHelper // decode encoded square brackets $name = str_replace(array('%5B', '%5D'), array('[', ']'), $name); - if (!in_array(strtolower($name), $parametersToExclude)) { + if (!self::in_array_reg(strtolower($name), $parametersToExclude)) { if (is_array($value)) { foreach ($value as $param) { if ($param === false) { diff --git a/plugins/SitesManager/lang/en.json b/plugins/SitesManager/lang/en.json index 21b4e2cb6766fecee052602fb7c544400cb5b376..56a812a4346592ac3b391053dcddcbf9ca2987a7 100644 --- a/plugins/SitesManager/lang/en.json +++ b/plugins/SitesManager/lang/en.json @@ -43,7 +43,7 @@ "KeepURLFragmentsLong": "Keep Page URL fragments when tracking Page URLs", "ListOfIpsToBeExcludedOnAllWebsites": "The IPs below will be excluded from being tracked on all websites.", "ListOfQueryParametersToBeExcludedOnAllWebsites": "The Query URLs parameters below will be excluded from URLs on all websites.", - "ListOfQueryParametersToExclude": "Enter the list of URL Query Parameters, one per line, to exclude from the Page URLs reports.", + "ListOfQueryParametersToExclude": "Enter the list of URL Query Parameters, one per line, to exclude from the Page URLs reports. Regular expressions such as /^sess.*|.*[dD]ate$/ are suported.", "MainDescription": "Your Web Analytics reports need Websites! Add, update, delete Websites, and show the JavaScript to insert in your pages.", "MenuManage": "Manage", "NotAnEcommerceSite": "Not an Ecommerce site", diff --git a/plugins/SitesManager/tests/System/expected/test_SitesManager__SitesManager.getSiteSettings.xml b/plugins/SitesManager/tests/System/expected/test_SitesManager__SitesManager.getSiteSettings.xml index e530794c522e1aeac73b0501ac65fda9889ba2b8..d12382f18e24c4373c7520da0c37c59547b9eb24 100644 --- a/plugins/SitesManager/tests/System/expected/test_SitesManager__SitesManager.getSiteSettings.xml +++ b/plugins/SitesManager/tests/System/expected/test_SitesManager__SitesManager.getSiteSettings.xml @@ -96,7 +96,7 @@ </uiControlAttributes> <availableValues /> <description /> - <inlineHelp>Enter the list of URL Query Parameters, one per line, to exclude from the Page URLs reports.<br /><br />Piwik will automatically exclude the common session parameters (phpsessid, sessionid, ...).</inlineHelp> + <inlineHelp>Enter the list of URL Query Parameters, one per line, to exclude from the Page URLs reports. Regular expressions such as /^sess.*|.*[dD]ate$/ are suported.<br /><br />Piwik will automatically exclude the common session parameters (phpsessid, sessionid, ...).</inlineHelp> <introduction /> <condition /> </row> diff --git a/tests/PHPUnit/Integration/Tracker/ActionTest.php b/tests/PHPUnit/Integration/Tracker/ActionTest.php index 5eab999b660926e923746301c7c720fe9ff73d2d..724fe963a0b05196c6dc83f11b7f77f1f8f1a622 100644 --- a/tests/PHPUnit/Integration/Tracker/ActionTest.php +++ b/tests/PHPUnit/Integration/Tracker/ActionTest.php @@ -173,6 +173,21 @@ class ActionTest extends IntegrationTestCase $this->assertEquals($filteredUrl[1], PageUrl::excludeQueryParametersFromUrl($url, $idSite)); } + /** + * Testing with some website specific parameters excluded using regular expressions + * @dataProvider getTestUrls + */ + public function testExcludeQueryParametersRegExSiteExcluded($url, $filteredUrl) + { + $excludedQueryParameters = '/p[4|2]/, /^var.*/'; + $this->setUpRootAccess(); + $idSite = API::getInstance()->addSite("site1", array('http://example.org'), $ecommerce = 0, + $siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null, + $excludedIps = '', $excludedQueryParameters, $timezone = null, $currency = null, + $group = null, $startDate = null, $excludedUserAgents = null, $keepURLFragments = 1); + $this->assertEquals($filteredUrl[1], PageUrl::excludeQueryParametersFromUrl($url, $idSite)); + } + /** * Testing with some website specific and some global excluded query parameters * @dataProvider getTestUrls diff --git a/tests/PHPUnit/Unit/UrlHelperTest.php b/tests/PHPUnit/Unit/UrlHelperTest.php index 09aab2c2f33aad46cb6a0988dbc3fbced9133f94..369cfb3a34551be9242a3f9a9a1b59c11f169ecf 100644 --- a/tests/PHPUnit/Unit/UrlHelperTest.php +++ b/tests/PHPUnit/Unit/UrlHelperTest.php @@ -234,4 +234,64 @@ class UrlHelperTest extends \PHPUnit_Framework_TestCase $this->assertEquals('add=foo', UrlHelper::getQueryFromUrl('/', array('add' => 'foo'))); $this->assertEquals('add[]=foo&add[]=test', UrlHelper::getQueryFromUrl('/', array('add' => array('foo', 'test')))); } + + + /** + * Dataprovider for testGetQueryStringWithExcludedParameters + */ + public function getQueryParameters() + { + return array( + array( + 'p1=v1&p2=v2', //expected + array('p1'=>'v1', 'p2'=>'v2'), //queryParameters + array() //parametersToExclude + ), + array( + 'p2=v2', + array('p1'=>'v1', 'p2'=>'v2'), + array('p1') + ), + array( + 'p1=v1&p2=v2', + array('p1'=>'v1', 'p2'=>'v2', 'sessionId'=>'HHSJHERTG'), + array('sessionId') + ), + array( + 'p1=v1&p2=v2', + array('p1'=>'v1', 'p2'=>'v2', 'sessionId'=>'HHSJHERTG'), + array('/session/') + ), + array( + 'p1=v1&p2=v2', + array('p1'=>'v1', 'sessionId'=>'HHSJHERTG', 'p2'=>'v2', 'token'=>'RYUN36HSAO'), + array('/[session|token]/') + ), + array( + '', + array('p1'=>'v1', 'p2'=>'v2', 'sessionId'=>'HHSJHERTG', 'token'=>'RYUN36HSAO'), + array('/.*/') + ), + array( + 'p2=v2&p4=v4', + array('p1'=>'v1', 'p2'=>'v2', 'p3'=>'v3', 'p4'=>'v4'), + array('/p[1|3]/') + ), + array( + 'p2=v2&p4=v4', + array('p1'=>'v1', 'p2'=>'v2', 'p3'=>'v3', 'p4'=>'v4', 'utm_source'=>'gekko', 'utm_medium'=>'email', 'utm_campaign'=>'daily'), + array('/p[1|3]/', '/utm_/') + ) + ); + } + + /** + * @dataProvider getQueryParameters + * @group Core + */ + public function testGetQueryStringWithExcludedParameters($expected, $queryParameters, $parametersToExclude) + { + $this->assertEquals($expected, UrlHelper::getQueryStringWithExcludedParameters($queryParameters, $parametersToExclude)); + } + }