Quelle est la meilleure façon de sélectionner tout le texte entre 2 balises - ex: le texte entre toutes les balises «pré» de la page.
html
regex
html-parsing
basheps
la source
la source
/<div>.*?<\/div>/.exec("<div><div></div></div>")
Réponses:
Vous pouvez utiliser
"<pre>(.*?)</pre>"
, (en remplaçant pre par le 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 un 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.
la source
<pre>
balises après avoir essayé<pre>(.*?)<\/pre>
, c'est parce que vous regardez ce qui est capturé par la correspondance complète au lieu du groupe de capture (. *?). Cela semble ringard mais je pense toujours "parenthèse = paire de voleurs" car à moins que le(
soit suivi d'un?
comme dans(?:
ou(?>
, chaque match aura deux captures: 1 pour le match complet et 1 pour le groupe de capture. Chaque jeu supplémentaire de parenthèses ajoute une capture supplémentaire. Vous devez simplement savoir comment récupérer les deux captures dans la langue avec laquelle vous travaillez.La balise peut être complétée sur une autre ligne. C'est pourquoi
\n
doit être ajouté.la source
(.|\n)*?
lors du traitement des balises HTML sur plusieurs lignes. La réponse sélectionnée ne fonctionne que si les balises HTML sont sur la même ligne.(.|\n)*?
pour correspondre à un caractère. Utilisez toujours.
avec les
modificateur (simple ligne). Ou une[\s\S]*?
solution de contournement./\*(.|\n)*?\*/
qui a fait le travail - merciC'est ce que j'utiliserais.
Fondamentalement, ce qu'il fait est:
(?<=(<pre>))
La sélection doit être précédée du<pre>
tag(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
Ceci est juste une expression régulière que je souhaite appliquer. Dans ce cas, il sélectionne une lettre ou un chiffre ou un caractère de nouvelle ligne ou certains caractères spéciaux répertoriés dans l'exemple entre crochets. Le caractère pipe|
signifie simplement " OU ".+?
Le caractère Plus indique pour sélectionner un ou plusieurs des éléments ci-dessus - l'ordre n'a pas d'importance. Le point d'interrogation change le comportement par défaut de «gourmand» en «non gourmand».(?=(</pre>))
La sélection doit être ajoutée par la</pre>
baliseEn fonction de votre cas d'utilisation, vous devrez peut-être ajouter des modificateurs tels que ( i ou m )
Ici, j'ai effectué cette recherche dans Sublime Text afin de ne pas avoir à utiliser de modificateurs dans mon regex.
Javascript ne prend pas en charge lookbehind
L'exemple ci-dessus devrait fonctionner correctement avec des langages tels que PHP, Perl, Java ... Javascript, cependant, ne prend pas en charge lookbehind, nous devons donc oublier d'utiliser
(?<=(<pre>))
et chercher une sorte de solution de contournement. Peut-être simplement supprimer les quatre premiers caractères de notre résultat pour chaque sélection, comme ici Regex correspond au texte entre les balisesRegardez également la DOCUMENTATION JAVASCRIPT REGEX pour les parenthèses non capturantes
la source
utilisez le modèle ci-dessous pour obtenir du contenu entre les éléments. Remplacez
[tag]
par l'élément réel dont vous souhaitez extraire le contenu.Parfois, les balises auront des attributs, comme les
anchor
balises ayanthref
, puis utiliseront le modèle ci-dessous.la source
<[tag]>
matchera<t>
,<a>
et<g>
Replace [tag] with the actual element you wish to extract the content from
partie.[]
auraient dû être complètement omises. Ce serait plus clair, en raison de leur signification dans RegEx et du fait que les gens scannent d'abord le code et lisent le texte après;)Pour exclure les balises de délimitation:
(?<=<pre>)
recherche du texte après<pre>
(?=</pre>)
cherche du texte avant</pre>
Les résultats seront textuels à l'intérieur de la
pre
balisela source
Vous ne devriez pas essayer d'analyser le html avec des expressions régulières voir cette question et comment cela s'est avéré.
Dans les termes les plus simples, html n'est pas un langage régulier, vous ne pouvez donc pas analyser complètement avec des expressions régulières.
Cela dit, vous pouvez analyser des sous-ensembles de html lorsqu'il n'y a pas de balises similaires imbriquées. Donc, tant que quelque chose entre et n'est pas cette balise elle-même, cela fonctionnera:
Une meilleure idée est d'utiliser un analyseur, comme le DOMDocument natif, pour charger votre html, puis sélectionnez votre balise et obtenez le html interne qui pourrait ressembler à ceci:
Et comme il s'agit d'un analyseur approprié, il sera capable de gérer les balises d'imbrication, etc.
la source
php
. Je ne sais pas comment PHP est entré en scène ...Essaye ça....
la source
Cela semble être l'expression régulière la plus simple de tout ce que j'ai trouvé
(?:<TAG>)
des correspondances([\s\S]*)
dans les correspondances(?:<\/TAG>)
de fermeture des correspondancesla source
Cette réponse suppose un soutien pour regarder autour de vous! Cela m'a permis d'identifier tout le texte entre les paires de balises d'ouverture et de fermeture. C'est tout le texte entre le «>» et le «<». Cela fonctionne parce que regarder autour de vous ne consomme pas les caractères auxquels il correspond.
(? <=>) ([\ w \ s] +) (? = </)
Je l'ai testé sur https://regex101.com/ en utilisant ce fragment HTML.
C'est un jeu en trois parties: le regard derrière, le contenu et le regard vers l'avenir.
J'espère que cela sert de point de départ pour 10. Chance.
la source
Puisque la réponse acceptée est sans code javascript, donc en ajoutant que:
la source
preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches)
cette expression régulière sélectionnera tout entre les balises. peu importe que ce soit dans la nouvelle ligne (travailler avec multiligne.la source
En Python, la définition de l'
DOTALL
indicateur capturera tout, y compris les nouvelles lignes.python example.py
Capture de texte entre toutes les balises d'ouverture et de fermeture d'un document
Pour capturer du texte entre toutes les balises d'ouverture et de fermeture dans un document,
finditer
est utile. Dans l'exemple ci-dessous, trois<pre>
balises d' ouverture et de fermeture sont présentes dans la chaîne.python example2.py
la source
Pour plusieurs lignes:
la source
Vous pouvez utiliser
Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
la source
J'utilise cette solution:
la source
En Javascript (entre autres), c'est simple. Il couvre les attributs et plusieurs lignes:
la source
la source