Regex sélectionnez tout le texte entre les balises

Quelle est la meilleure façon de sélectionner tout le texte entre 2 balises – ex: le texte entre toutes les balises ‘pre’ sur la page.

Vous pouvez utiliser "

(.*?)

" , (en remplaçant pre par le texte de votre choix) et extraire le premier groupe (pour des instructions plus spécifiques spécifiez un langage) mais cela suppose la notion simpliste que vous avez HTML très simple et valide.

Comme d’autres commentateurs l’ont suggéré, si vous faites quelque chose de complexe, utilisez un parsingur HTML.

Tag peut être complété dans une autre ligne. C’est pourquoi \n doit être ajouté.

 
(.|\n)*?< \/PRE>

C’est ce que j’utiliserais.

 (?< =(
))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(

))

Fondamentalement, ce qu’il fait est:

(?< =(

)) sélection doit être précédée de la 

(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| ) est juste une expression régulière que je veux appliquer Dans ce cas, il sélectionne lettre ou chiffre ou caractère de nouvelle ligne ou certains caractères spéciaux listés dans l'exemple entre crochets. Le caractère de barre | signifie simplement " OU ".

+? Plus les états de caractère pour sélectionner un ou plusieurs des éléments ci-dessus - l'ordre n'a pas d'importance. Le point d'interrogation modifie le comportement par défaut de «gourmand» à «ungreedy».

(?=()) sélection doit être ajoutée par la


entrer la description de l'image ici

Selon votre cas d'utilisation, vous devrez peut-être append des modificateurs tels que ( i ou m )

  • i - insensible à la casse
  • m - recherche multiligne

Ici, j'ai effectué cette recherche dans Sublime Text afin de ne pas avoir à utiliser de modificateurs dans mon regex.

Javascript ne supporte pas lookbehind

L'exemple ci-dessus devrait fonctionner correctement avec des langages tels que PHP, Perl, Java ... Cependant, Javascript ne supporte pas lookbehind, nous devons donc oublier d'utiliser (?< =(

)) et chercher une solution de contournement .  Peut-être que les quatre premiers caractères de notre résultat doivent être supprimés pour chaque sélection, comme ici 

Consultez également la documentation JAVASCRIPT REGEX pour les parenthèses non capturées

Vous ne devriez pas essayer d’parsingr le HTML avec des expressions rationnelles voir cette question et comment elle s’est avérée.

En termes simples, le langage HTML n’est pas un langage standard, vous ne pouvez donc pas parsingr complètement les expressions régulières.

Cela dit, vous pouvez parsingr des sous-ensembles de HTML lorsque aucune balise similaire n’est nestede. Donc, tant que n’importe quoi entre et n’est pas ce tag lui-même, cela fonctionnera:

 preg_match("/< ([\w]+)[^>]*>(.*?)< \/\1>/", $subject, $matches); $matches = array ( [0] => full matched ssortingng [1] => tag name [2] => tag content ) 

Une meilleure idée est d’utiliser un parsingur, comme le DOMDocument natif, pour charger votre fichier HTML, puis sélectionnez votre tag et obtenez le code HTML interne qui pourrait ressembler à ceci:

 $obj = new DOMDocument(); $obj -> load($html); $obj -> getElementByTagName('el'); $value = $obj -> nodeValue(); 

Et comme il s’agit d’un parsingur approprié, il sera capable de gérer les étiquettes d’imbrication, etc.

utilisez le modèle ci-dessous pour obtenir le contenu entre les éléments. Remplacez [tag] par l’élément que vous souhaitez extraire du contenu.

 < [tag]>(.+?) 

Parfois, les balises auront des atsortingbuts, comme une balise d’ anchor ayant href , puis utilisez le modèle ci-dessous.

  < [tag][^>]*>(.+?) 

Essaye ça….

 (?< =\)(\s*.*\s*)(?=\< \/any_tag\>) 
 var str = "Lorem ipsum 
text 1

Lorem ipsum

text 2

"; str.replace(/

(.*?)< \/pre>/g, function(match, g1) { console.log(g1); });

Pour exclure les tags de délimitation:

 "(?< =
)(.*?)(?=

)"

Pour plusieurs lignes:

 (.+)((\s)+(.+))+ 

Vous pouvez utiliser Pattern pattern = Pattern.comstack( "[^< 'tagname'/>]" );

J’utilise cette solution:

 preg_match_all( '/< ((?!<)(.|\n))*?\>/si', $content, $new); var_dump($new); 

Cela semble être l’expression la plus simple de tout ce que j’ai trouvé

 (?:)([\s\S]*)(?:< \/TAG>) 
  1. Exclure la balise d’ouverture (?:) des correspondances
  2. Inclure tout caractère blanc ou blanc ([\s\S]*) dans les correspondances
  3. Exclure la balise de fermeture (?:< \/TAG>) des correspondances
 
([\r\n\s]*(?!< \w+.*[\/]*>).*[\r\n\s]*|\s*[\r\n\s]*)(((?!< \/code>)[\s\S])*)< \/code>[\r\n\s]*((?!< \w+.*[\/]*>).*|\s*)[\r\n\s]*< \/pre>