preg_replace 用于排除指定单词集的模板
preg_replace for a template which excludes the specified set of words
我需要通过在变量类型前面加上指定的命名空间来转换文本文件。但我需要跳过基本类型,例如 array
或 string
.
所以正文
/**
* @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
);
如果有人解释它是如何工作的,我将不胜感激))
我需要通过在变量类型前面加上指定的命名空间来转换文本文件。但我需要跳过基本类型,例如 array
或 string
.
所以正文
/**
* @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
);
如果有人解释它是如何工作的,我将不胜感激))