Add Sniff that discourages use of raw PCRE
authorTim Düsterhus <duesterhus@woltlab.com>
Fri, 4 Jan 2013 15:35:46 +0000 (16:35 +0100)
committerTim Düsterhus <duesterhus@woltlab.com>
Fri, 4 Jan 2013 15:35:46 +0000 (16:35 +0100)
Closes #1054

CodeSniff/WCF/Sniffs/PHP/DiscouragePCRESniff.php [new file with mode: 0644]
CodeSniff/WCF/ruleset.xml
wcfsetup/install/files/lib/system/Regex.class.php

diff --git a/CodeSniff/WCF/Sniffs/PHP/DiscouragePCRESniff.php b/CodeSniff/WCF/Sniffs/PHP/DiscouragePCRESniff.php
new file mode 100644 (file)
index 0000000..5d300e3
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Discourages use of raw PCRE functions. \wcf\system\Regex is a superior way to use Regex.
+ * 
+ * @author     Tim Duesterhus
+ * @license    BSD Licence <https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt>
+ * @package    com.woltlab.wcf
+ * @category   Community Framework
+ */
+class WCF_Sniffs_PHP_DiscouragePCRESniff extends Generic_Sniffs_PHP_ForbiddenFunctionsSniff {
+       /**
+        * A list of forbidden functions with their alternatives.
+        *
+        * The value is NULL if no alternative exists. IE, the
+        * function should just not be used.
+        *
+        * @var array(string => string|null)
+        */
+       protected $forbiddenFunctions = array(
+               'preg_match_all' => null,
+               'preg_match' => null,
+               'preg_replace' => null,
+               'preg_replace_callback' => null,
+               'preg_split' => null
+       );
+       
+       /**
+        * Constructor.
+        */
+       public function __construct() {
+               return;
+       }
+       
+       /**
+        * Generates the error or warning for this sniff.
+        *
+        * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
+        * @param int                           $stackPtr  The position of the forbidden function
+        *                                                               in the token array.
+        * @param string                         $function  The name of the forbidden function.
+        * @param string                         $pattern   The pattern used for the match.
+        *
+        * @return void
+        */
+       protected function addError($phpcsFile, $stackPtr, $function, $pattern = null) {
+               $data = array($function);
+               $error = 'Use of raw PCRE %s() is discouraged. Please use \wcf\system\Regex which provides OO-access to regex';
+               $type = 'Discourage';
+               
+               $phpcsFile->addWarning($error, $stackPtr, $type, $data);
+       }
+}
index 8d6a7820ce22ca4a9a955e29236ff4469d855f6b..4c1e73d580c3e027e296d36db297a559c5b50e38 100644 (file)
@@ -31,6 +31,7 @@
        <rule ref="Squiz.PHP.ForbiddenFunctions" />
        <rule ref="WCF.Classes.ClassFileName" />
        <rule ref="WCF.ControlStructures.ControlSignature" />
+       <rule ref="WCF.PHP.DiscouragePCRE" />
        <rule ref="WCF.Namespaces.UseDeclaration" />
        <rule ref="WCF.WhiteSpace.SuperfluousWhitespace" />
        <rule ref="Zend.Files.ClosingTag" />
index 65acebd0f98f4828a870728ad8d653f94354ee2b..4b5cc409eb780fd04e6c28b24541679b1370e686 100644 (file)
@@ -125,6 +125,7 @@ final class Regex {
                }
        }
        
+       // @codingStandardsIgnoreStart
        /**
         * Checks whether the regex matches the given string.
         * 
@@ -164,6 +165,7 @@ final class Regex {
        public function split($string) {
                return $this->checkResult(preg_split($this->regex, $string), 'split');
        }
+       // @codingStandardsIgnoreEnd
        
        /**
         * Checks whether there was success.