2016-07-31 20 views
0

Ich muss Textdatei ändern Variablen Typen durch Voranstellen sie mit angegebenen Namespace. Aber ich muss Basistypen wie array oder string überspringen.preg_replace für eine Vorlage, die den angegebenen Satz von Wörtern ausschließt

So der Text

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

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

Sollte auf

/** 
* @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) { 
    ... 
} 

Meine Transformation sieht nun umgewandelt werden, wie

$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 
); 

folgt Dies funktioniert, aber Basistypen sind als andere vorangestellt.

Ich habe versucht, dies mit dieser Spitze zu lösen: Regular expression to match a line that doesn't contain a word?

Und viele andere ... Aber ich schlug fehl.

p.s. Ich bin darüber gestoßen, die Transformation des WSDL-Schemas in eine Reihe von Klassen für den Zugriff auf den SOAP-Service

+0

Also, wo ist das Problem mit '/ @ param \ s + ((?: Array |?! string | calleable) \ s) ([A-Za-z] +) \ s + \ $ (\ w +)/'(nach Bedarf ergänzen) ... Wie die andere Frage zeigt? – bwoebi

+0

@bwoebi ich weiß es nicht, aber das funktioniert nicht ... versucht, dieses Muster zu verwenden, funktioniert es gut in refiddle: http://refiddles.com/refiddles/579e914475622d2391020000 aber in meinem Code funktioniert es nicht, "Array "und" String "immer noch – oakymax

+0

@bwoebi behoben, funktioniert jetzt. sieht aus, als wäre ein Tippfehler in meinem Code ... vielen Dank!)) – oakymax

Antwort

0

Dank @bwoebi für die Antwort in den Kommentaren machen!

funktioniert jetzt:

$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 
); 

Ich wäre dankbar, wenn jemand erklären, wie es funktioniert))