Regex sélectionner 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.

86
demandé sur user990423 2011-08-24 00:42:40

13 réponses

vous pouvez utiliser "<pre>(.*?)</pre>" , (en remplaçant pre par n'importe quel texte que vous voulez) et extraire le premier groupe (pour des instructions plus spécifiques spécifiez une langue) 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 analyseur HTML.

111
répondu PyKing 2011-08-23 21:00:44
L'étiquette

peut être remplie sur une autre ligne. C'est pourquoi \n doit être ajouté.

<PRE>(.|\n)*?<\/PRE>
99
répondu zac 2015-03-17 11:21:27

C'est ce que j'utiliserais.

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

fondamentalement, ce qu'il fait est:

(?<=(<pre>)) la sélection doit être préparée avec <pre> tag

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

+? plus les états de caractères pour sélectionner un ou plusieurs de l'ordre ci - dessus n'a pas d'importance. point d'interrogation modifie le comportement par défaut de "gourmand" à "moins gourmand'.

(?=(</pre>)) sélection doivent être annexés par le <pre> tag

enter image description here

selon votre cas d'utilisation vous pourriez avoir besoin d'ajouter des modificateurs comme ( i ou m )

  • i - insensible à la casse
  • m - recherche multi-ligne

ici j'ai effectué cette recherche en texte Sublime donc je n'ai pas eu à 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 ... Javascript, cependant, ne supporte pas lookbehind donc nous devons oublier d'utiliser (?<=(<pre>)) et chercher une sorte de solution. Peut-être simplement retirer les quatre premiers caractères de notre résultat pour chaque sélection comme ici Regex match de texte entre les balises

regardez aussi la DOCUMENTATION REGEX JAVASCRIPT pour Non-capturing parentheseses

10
répondu DevWL 2018-01-31 16:40:51

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

<[tag]>(.+?)</[tag]>

parfois tags auront des attributs , comme anchor tag ayant href , puis utiliser le modèle ci-dessous.

 <[tag][^>]*>(.+?)</[tag]>
7
répondu Shravan Ramamurthy 2018-08-20 15:56:43

Vous ne devriez pas être en train d'essayer de parser du html avec regexes voir cette question et comment il s'est avéré.

dans les termes les plus simples, html n'est pas un langage régulier de sorte que vous ne pouvez pas entièrement analyser est avec des expressions régulières.

ayant dit que vous pouvez analyser des sous-ensembles de html quand il n'y a pas de tags similaires imbriqués. Aussi longtemps que quelque chose entre et n'est pas cette étiquette elle-même, cela fonctionnera:

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

Une meilleure idée est d'utiliser un analyseur, comme le DOMDocument natif, pour charger votre html, puis sélectionner votre étiquette et obtenir le html intérieur qui pourrait ressembler à quelque chose comme ceci:

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

et comme il s'agit d'un analyseur approprié, il sera capable de traiter les étiquettes de nidification, etc.

6
répondu sg3s 2017-05-23 12:26:29

essayez ceci....

(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
3
répondu Heriberto Rivera 2015-10-23 18:31:58

var str = "Lorem ipsum <pre>text 1</pre> Lorem ipsum <pre>text 2</pre>";
    str.replace(/<pre>(.*?)<\/pre>/g, function(match, g1) { console.log(g1); });

depuis la réponse acceptée est sans code javascript, ajoutant que:

1
répondu Shishir Arora 2017-08-28 01:41:51

pour exclure les étiquettes délimitantes:

"(?<=<pre>)(.*?)(?=</pre>)"
1
répondu Jean-Simon Collard 2018-07-04 19:31:13

pour les lignes multiples:

<htmltag>(.+)((\s)+(.+))+</htmltag>
0
répondu Dilip 2016-11-16 22:18:11

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

0
répondu Ambrish Rajput 2017-02-17 15:10:32

j'utilise cette solution:

preg_match_all( '/<((?!<)(.|\n))*?\>/si',  $content, $new);
var_dump($new);
0
répondu T.Todua 2017-11-29 14:50:08

cela semble être l'expression régulière la plus simple de tout ce que j'ai trouvé

(?:<TAG>)([\s\S]*)(?:<\/TAG>)
  1. Exclure la balise d'ouverture (?:<TAG>) dans les matchs
  2. Inclure n'importe quel espace ou non les espaces ([\s\S]*) dans les matchs
  3. exclure l'étiquette de fermeture (?:<\/TAG>) des allumettes
0
répondu maqduni 2018-08-30 09:19:02
<pre>([\r\n\s]*(?!<\w+.*[\/]*>).*[\r\n\s]*|\s*[\r\n\s]*)<code\s+(?:class="(\w+|\w+\s*.+)")>(((?!<\/code>)[\s\S])*)<\/code>[\r\n\s]*((?!<\w+.*[\/]*>).*|\s*)[\r\n\s]*<\/pre>
-3
répondu user5988518 2016-02-26 23:04:04