2010-05-17 5 views
0

Existe-t-il un moyen de rechercher des balises personnalisées dans regexp I.e. match deRecherche d'une balise d'ouverture et de fermeture dans Regexp

{a}sometext{/a} 

En plus

{c=#fff}sometext{/c} 

Alors qu'il trouve tout le bloc de contenu intérieur? Le problème est le someText pourrait avoir une autre balise comme dans:

{a=http://www.google.com}{b}Hello, world{/b}{/a} 

Les seules solutions que je peux venir avec correspondraient de {... à .../b} quand je veux {a ... à .../a} existe-t-il une seule solution d'expression rationnelle, ou serait-il préférable de faire correspondre le début, puis d'utiliser une autre méthode pour trouver la fin à partir de la sauvegarde, et l'extraire de cette façon? J'utilise PHP 5.2 donc j'ai toutes les options que cela implique.

Répondre

1

On dirait que vous essayez de faire ce que MediaWiki fait déjà avec le langage de balisage wiki. Je suggère d'utiliser leur analyseur et leur balisage ou si vous choisissez de rouler le vôtre, vous pourriez trouver l'inspiration de voir comment ils le font.

Manual for Parser.php

Source for Parser.php

+0

C'est exactement ce que j'essayais de trouver, merci! J'essaye de rouler le mien, pour l'expérience d'apprentissage aussi bien que parce que je veux seulement certaines caractéristiques. – Rixius

2

Cela fonctionne:

$subject = 'bla bla{a=http://www.google.com}{b}Hello, world{/b}{/a} bla'; 
$regex = '~\\{a(?:=[^}]+)?\\}(.*?)\\{/a\\}~'; 
preg_match($regex, $subject, $matches); 
var_dump($matches); 

donne:

array(2) { 
    [0]=> 
    string(48) "{a=http://www.google.com}{b}Hello, world{/b}{/a}" 
    [1]=> 
    string(19) "{b}Hello, world{/b}" 
} 

BEGIN EDIT Vous pouvez faire la regex plus générale avec des backreferences

$regex = '~\\{([a-z]+)(?:=[^}]+)?\\}(.*?)\\{/\\1\\}~'; 

mais dans ce cas, je ne idée comment faire correspondre les balises internes de profondeur arbitraire. END EDIT

Cependant, j'ai vivement recommandé de ne pas utiliser une expression régulière à cette fin. Je vous suggère de parcourir sur la chaîne, un tableau à la fois et d'utiliser une pile auxiliaire pour garder une trace des étiquettes que vous trouvez (utilisez array_push, array_pop et end pour jeter un coup d'oeil).

+0

Merci pour l'expression rationnelle de travail, mais je ne comprends pas tout à fait votre suggestion. si ce serait plus efficace, j'adorerais l'utiliser. Connaissez-vous des articles à ce sujet? – Rixius

+0

Google pour "parser tag pile imbriquée" ou quelque chose de similaire, vous trouverez des articles sur la façon d'analyser les balises imbriquées. – Artefacto

Questions connexes