1
votes

Comment sélectionner tous les hrefs qui ne commencent pas par deux ".." (points) dans l'expression régulière

J'essaye de sélectionner des lignes spécifiques dans un document html en utilisant regex. Je cherche à sélectionner des lignes commençant par et qui ne contiennent PAS dans le href les caractères ../

Voici une partie du html que j'ai

<script type="text/javascript" src="/js/IP_Master_PT_RTL.master.js"></script>
<link rel="stylesheet" type="text/css" href="../global.design-editor.com/v8/main.min1024.css?v=_STAGING-Publisher_20180327.1" />
<link rel="stylesheet" type="text/css" href="../fonts.googleapis.com/earlyaccess/alefhebrew.css" />
<link rel="stylesheet" type="text/css" href="ad-systems368c.css?v=4701716615" />

Voici ce que j'ai fait jusqu'à présent: Je me rapproche mais je voudrais sélectionner la balise entière et ne pas sélectionner les autres balises.

Je viens de commencer à apprendre les expressions régulières, donc je suis assez nouveau dans ce domaine.

p>


2 commentaires

"J'essaie de sélectionner des lignes spécifiques dans un document html à l'aide de regex." Ne le faites pas , cela ne peut pas être fait de manière fiable. Si vous avez besoin de travailler avec HTML, utilisez un analyseur HTML.


si vous faites cela dans un navigateur en utilisant javascript, vous pouvez utiliser dom apis pour lire tous les éléments de lien, puis faire une correspondance régulière ou une correspondance de chaîne pour la vérification href. exemple: document.querySelectorAll ('link'). forEach ((linkelement, i) => {console.log (linkelement.attributes ['href']);})


3 Réponses :


3
votes

En utilisant JavaScript dans le navigateur, vous pouvez simplement rechercher tous les éléments , puis les filtrer en fonction de l'attribut href

<script type="text/javascript" src="/js/IP_Master_PT_RTL.master.js"></script>
<link rel="stylesheet" type="text/css" href="../global.design-editor.com/v8/main.min1024.css?v=_STAGING-Publisher_20180327.1" />
<link rel="stylesheet" type="text/css" href="../fonts.googleapis.com/earlyaccess/alefhebrew.css" />
<link rel="stylesheet" type="text/css" href="ad-systems368c.css?v=4701716615" />
let allLinks = document.querySelectorAll('link');

let filteredLinks = Array.from(allLinks)
  .filter(el => el.getAttribute("href").startsWith("../") == false);

console.log(filteredLinks);


0 commentaires

0
votes
const links = [...document.getElementsByTagName('link')];
const newLinks = links.filter(link => !link.outerHTML.includes('../'))
console.log(newLinks)

2 commentaires

.includes interceptera cette séquence n'importe où dans la chaîne. En fait, n'importe où dans le HTML entier pour cet élément.


Oui vous avez raison. Je ne connaissais pas getAttribute . Votre solution est bien meilleure



-2
votes

Peut-être qu'il / elle analyse des fichiers alors il / elle a besoin de ragex. Voici donc ma solution ...

Je suis également nouveau sur ragex, mais cela pourrait fonctionner pour vous.

<link\s*.*href\=\"[^(\.\.\/)].*\".*/>

vérifiez également ce constructeur de ragex , amusez-vous bien ..


1 commentaires

C'est r e gex - pour l'expression régulière. Et ce modèle ne correspondra pas à href = '.. / somevalue' à cause des guillemets. La classe de caractères à l'intérieur 1. n'a pas besoin d'échappements 2. ne correspondra pas uniquement à ../ mais aussi à . ou . / ou / . Cela peut également correspondre à quelque chose que vous n'aviez pas du tout prévu, par exemple avec le HTML '
'