2010-12-09 5 views
2

Je suis en train d'écrire une sorte d'analyseur en PHP: il reçoit un texte contenant des variables entre #*test-var*#, par exemple: # blabla test var # blabla Ce que je suis en train de faire est de modifier ce texte il devient: blabla <p>test-var</p> blablaexpression rationnelle contenu de la variable

en plus de cela, le type de variable peut changer, par exemple: blabla #*:test-var*# blabla devrait être quelque chose comme: blabla <div>test-var</div>

(je l'ai utilisé quelques balises simples HTML ici (par exemple, la <p> tag) pour l'expliquer, mais finalement cela devrait devenir plus avancé HTML)

Quelqu'un a-t-il des suggestions?

+0

SO vous permet d'utiliser certaines balises HTML pour baliser votre question, donc si vous voulez qu'ils apparaissent comme contenu normal, il faut soit utiliser les entités HTML, ou entourer de préférence les balises avec des accents graves (par exemple ') pour marquer les comme des exemples de code. – AgentConundrum

Répondre

0

Une simple regex fera l'affaire.

$string = 'blah blah #*test-var*# blah blah'; 
$types = array(
    array(
     '/#\*(.*?)\*#/', 
     '<p>$1</p>' 
    ), 
    array(
     '/#\*:(.*?)\*#/', 
     '<div>$1</div>' 
    ) 
); 
foreach ($types as $type) { 
    $string = preg_replace($type[0], $type[1], $string); 
} 

Modifier: ajout de la prise en charge de plusieurs variables.

+0

Eh bien la chose est que le contenu de '# * .... * #' identiefies le type de sortie, donc j'ai peur que cela ne fonctionne pas – user485659

+0

Devrait utiliser un drapeau non-gourmand dans le cas où ils ont plusieurs "tags" dans une chaîne. –

+0

@ Brad Christie: Il y a un point d'interrogation dans l'expression; Je suis à peu près sûr que ça tue la gourmandise. – Jonah

0
function some_kind_of_parser($input, $wrapper_tag='p', $wrapper_attributes='') { 
    if ($wrapper_attributes == '') 
    $open_tag = "<$wrapper_tag>"; 
    else 
    $open_tag = "<$wrapper_tag $wrapper_attributes>"; 

    $close_tag ="</$wrapper_tag>"; 

    $regex = '/[^(?:#\*)]+#\*([^(#\*)]+)\*#[^(?:#\*)]+/'; 
    return preg_replace($regex, "$open_tag$1$close_tag", $input); 
} 

$test = 'blah blah #*test-var*# blah blah'; 

echo some_kind_of_parser($test); 
# => <p>test-var</p> 

echo some_kind_of_parser($test, 'div', 'class="foo" id ="bar"'); 
# => <div class="foo" id ="bar">test-var</div> 
Questions connexes