preg_replace用于排除指定单词集的模板

时间:2016-07-31 22:52:27

标签: php regex preg-replace

我需要通过在指定的命名空间前面添加它们来转换文本文件更改变量类型。但我需要跳过基本类型,例如arraystring

所以文字

/**
 * @param ParamType $param
 * @return ReturnType
 */
public function SomeFunction(ParamType $param) {
   ...
}

/**
 * @param array $param
 * @return string
 */
public function OtherFunction($param) {
   ...
}

应转换为

/**
 * @param \My\Namespace\ParamType $param
 * @return \My\Namespace\ReturnType
 */
public function SomeFunction(\My\Namespace\ParamType $param) {
   ...
}

/**
 * @param array $param
 * @return string
 */
public function OtherFunction($param) {
   ...
}

我的转型现在看起来如下

$classFileText = preg_replace(
    [
        '/@param\s+([A-Za-z]+)\s+\$(\w+)/',
        '/@return\s+([A-Za-z]+)/',
        '/@var\s+([A-Za-z]+)/',
        '/\s+function\s+([A-Za-z]+)\s*\(\s*([A-Za-z]+)\s+\$(\w+)/',
    ],
    [
        '@param \\' . $typesNamespace . '\\\\$1 $\\2 ',
        '@return \\' . $typesNamespace . '\\\\$1',
        '@var \\' . $typesNamespace . '\\\\$1',
        ' function $1(\\' . $typesNamespace . '\\\\$2 $\\3',
    ],
    $classFileText
);

这样可行,但基本类型前置为其他类型。

我尝试使用此提示解决此问题:Regular expression to match a line that doesn't contain a word?

还有很多人......但我失败了。

P.S。我遇到了这个问题,将WSDL模式转换为一组类来访问SOAP服务

1 个答案:

答案 0 :(得分:0)

感谢@bwoebi评论中的答案!

现在工作正常:

$classFileText = preg_replace(
    [
        '/@param\s+(?!(?:array|string)\s)([A-Za-z]+)\s+\$(\w+)/',
        '/@return\s+(?!(?:array|string)\s)([A-Za-z]+)/',
        '/@var\s+(?!(?:array|string)\s)([A-Za-z]+)/',
        '/\s+function\s+([A-Za-z]+)\s*\(\s*(?!(?:array|string)\s)([A-Za-z]+)\s+\$(\w+)/',
    ],
    [
        '@param \\' . $typesNamespace . '\\\\$1 \$$2 ',
        '@return \\' . $typesNamespace . '\\\\$1',
        '@var \\' . $typesNamespace . '\\\\$1',
        ' function $1(\\' . $typesNamespace . '\\\\$2 \$$3',
    ],
    $classFileText
);

如果有人解释它是如何工作的,我将不胜感激))