2010-08-14 6 views
2

J'essaie d'extraire toutes les sous-chaînes dans une chaîne qui se trouve entre les chaînes/* et * /. Je sais que cela devra probablement être fait avec des expressions régulières, mais j'ai du mal à obtenir la regex correcte puisque le personnage étoile est en fait utilisé pour symboliser des caractères répétés. J'essaie d'utiliser la méthode preg-match en PHP, voici ce que j'ai trouvé jusqu'ici mais je n'ai pas beaucoup de chance.Regex en PHP entre/* & */pour preg-match

<?php 
    $aString = "abcdef/*ghij*/klmn/*opqrs*/tuvwxyz"; 
    preg_match("/*/.*/", $aString, $anArray); 

    for ($i = 0; $i < count($anArray); i++) 
     echo $anArray[i] . "\n"; 
?> 
+0

Vous ne se trouve pas à analyser des blocs de commentaires sur le code source PHP avec cela? –

+0

J'essaye de construire un formateur de code PHP pour afficher le code PHP en utilisant le code HTML – jazzdawg

+0

Avez-vous essayé votre code avant de l'afficher ici? Il y a des erreurs de base comme: i -> $ i que l'analyseur php devrait signaler. –

Répondre

0

Code de travail:

$aString = "abcdef/*ghij*/klmn/*opqrs*/tuvwxyz"; 

// SIMPLE VERSION WHERE ASTERISK MAY NOT BE IN THE COMMENT 
// \/\* is just escape sequence for /* 
// [^\*]* - in comment may be whatever except * (asterisk) 
// \*\/ is escape sequence for */ 
preg_match_all("#\/\*[^\*]*\*\/#", $aString, $anArray); 

// BETTER VERSION 
// http://www.regular-expressions.info/refadv.html - for explanation of ?: and ?! 
preg_match_all("#\/\*" . "((?:(?!\*\/).)*)" . "\*\/#", $aString, $anArray); 


var_dump($anArray); // easier for debugging than for-loop 

sortie pour une meilleure version:

array(2) { 
    [0]=> 
    array(2) { 
    [0]=> 
    string(8) "/*ghij*/" 
    [1]=> 
    string(9) "/*opqrs*/" 
    } 
    [1]=> 
    array(2) { 
    [0]=> 
    string(4) "ghij" 
    [1]=> 
    string(5) "opqrs" 
    } 
} 
+0

Merci beaucoup fonctionne très bien – jazzdawg

+0

Si je mets une étoile quelque part là-dedans (ie: '/ * gh * ij *') ça va échouer – NullUserException

+0

@NullUserException: Oui, j'étais au courant de cela et j'ai ajouté une nouvelle version qui devrait mieux travailler. –

0

Escape the * à utiliser, et entre parenthèses publicitaires pour capturer le contenu comme ça: /\*(.*)\*/, et vous devez utiliser preg_match_all pour trouver tous les matches de votre chaîne.

(et plus facile qu'un pour, utilisez var_dump($anArray))

0
$aString = "abcdef/*ghij*/klmn/*opqrs*/tuvwxyz"; 
preg_match_all("/\/\*(.*?)\*\//", $aString, $anArray,PREG_SET_ORDER); 
var_dump($anArray); 
0

Si (comme vous le dites dans l'un des commentaires) vous essayez d'afficher du code PHP dans HT ML il y a effectivement une fonction intégrée (highlight_file) qui fait exactement cela.

libre libre d'ignorer si vous utilisez cela comme un exercice d'apprentissage, etc. :-)

1

Pour extraire des sections de commentaire sur le code PHP, utilisez le Tokenizer.

token_get_all() analyse le code et renvoie un tableau d'éléments. Les commentaires seront représentés par T_COMMENT éléments.

Cela a le grand avantage d'attraper tous les moyens possibles d'avoir des commentaires dans le code PHP:

/* This way, */ 

// This way 

# and this way 
+0

Merci, je vais jeter un oeil dans ce – jazzdawg

+1

Plus important: Il ne vous donnera pas de faux positifs comme dans '$ str ="/* foo */";' – Gumbo

+0

@Gumbo bon point. –

0

Je pense que le regex sera simple

\/\*.*?\*\/ 

démo est ici d'un code de travail en utilisant testeur d'expression régulière

http://liveregex.com/WoDbk