/**
* @param array $names
*/
- function __construct( $names = [] ) {
+ public function __construct( $names = [] ) {
$this->names = $names;
}
* Get a 2-d hashtable for this array
* @return array
*/
- function getHash() {
+ public function getHash() {
if ( is_null( $this->hash ) ) {
global $wgContLang;
$this->hash = [ 0 => [], 1 => [] ];
* Get the base regex
* @return array
*/
- function getBaseRegex() {
+ public function getBaseRegex() {
if ( is_null( $this->baseRegex ) ) {
$this->baseRegex = [ 0 => '', 1 => '' ];
+ $allGroups = [];
foreach ( $this->names as $name ) {
$magic = MagicWord::get( $name );
$case = intval( $magic->isCaseSensitive() );
foreach ( $magic->getSynonyms() as $i => $syn ) {
// Group name must start with a non-digit in PCRE 8.34+
$it = strtr( $i, '0123456789', 'abcdefghij' );
- $group = "(?P<{$it}_{$name}>" . preg_quote( $syn, '/' ) . ')';
+ $groupName = $it . '_' . $name;
+ $group = '(?P<' . $groupName . '>' . preg_quote( $syn, '/' ) . ')';
+ // look for same group names to avoid same named subpatterns in the regex
+ if ( isset( $allGroups[$groupName] ) ) {
+ throw new MWException(
+ __METHOD__ . ': duplicate internal name in magic word array: ' . $name
+ );
+ }
+ $allGroups[$groupName] = true;
if ( $this->baseRegex[$case] === '' ) {
$this->baseRegex[$case] = $group;
} else {
* Get an unanchored regex that does not match parameters
* @return array
*/
- function getRegex() {
+ public function getRegex() {
if ( is_null( $this->regex ) ) {
$base = $this->getBaseRegex();
$this->regex = [ '', '' ];
*
* @return string
*/
- function getVariableRegex() {
+ public function getVariableRegex() {
return str_replace( "\\$1", "(.*?)", $this->getRegex() );
}
*
* @return array
*/
- function getRegexStart() {
+ public function getRegexStart() {
$base = $this->getBaseRegex();
$newRegex = [ '', '' ];
if ( $base[0] !== '' ) {
*
* @return array
*/
- function getVariableStartToEndRegex() {
+ public function getVariableStartToEndRegex() {
$base = $this->getBaseRegex();
$newRegex = [ '', '' ];
if ( $base[0] !== '' ) {
* @throws MWException
* @return array
*/
- function parseMatch( $m ) {
+ public function parseMatch( $m ) {
reset( $m );
while ( list( $key, $value ) = each( $m ) ) {
if ( $key === 0 || $value === '' ) {
* Returns an associative array, ID => param value, for all items that match
* Removes the matched items from the input string (passed by reference)
*
- * @param string $text
+ * @param string &$text
*
* @return array
*/
* Return false if no match found and $text is not modified.
* Does not match parameters.
*
- * @param string $text
+ * @param string &$text
*
* @return int|bool False on failure
*/