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

preg_replace for a template which excludes the specified set of words

我需要通过在变量类型前面加上指定的命名空间来转换文本文件。但我需要跳过基本类型,例如 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 . '\\ $\2 ',
        '@return \' . $typesNamespace . '\\',
        '@var \' . $typesNamespace . '\\',
        ' function (\' . $typesNamespace . '\\ $\3',
    ],
    $classFileText
);

这可行,但基本类型与其他基本类型一样。

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

还有很多其他的...但我失败了。

p.s。我遇到了这个,将 WSDL 模式转换为一组 类 以访问 SOAP 服务

感谢@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 . '\\ $ ',
        '@return \' . $typesNamespace . '\\',
        '@var \' . $typesNamespace . '\\',
        ' function (\' . $typesNamespace . '\\ $',
    ],
    $classFileText
);

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