Premessa: in casi del genere, per poter formulare una soluzione veramente valida, sarebbe opportuno fornire molti più esempi di casistiche in cui la regex debba trovare o non trovare dei risultati.
Infatti, per rilevare il caso specifico del tuo esempio, basterebbe una regex del genere:
codice:
<a[^>]+href[^>]*<\/a>
con cui puoi eseguire ricerche del genere:
codice:
// Occorrenze trovate
<a href="https://www.sito.it/" target="_blank" rel="noopener"proprietà</a>
<a class="foo" href="bar" link</a>
// Occorrenze non trovate
<a href="https://www.sito.it/" target="_blank" rel="noopener">proprietà</a>
<a class="foo" href="bar">link</a>
Fino a questo punto funziona come hai esplicitamente richiesto, però in casi particolari potresti ottenere dei risultati inattesi.
La cosa può essere molto più complessa se si ragiona in termini di validità del codice HTML; possono entrare in gioco diversi fattori: prevedere possibili tag interni, stabilire quale sia la corretta stesura degli attributi, nonché la regolare sintassi del codice HTML, quindi stabilire su quale versione HTML si basa il documento (o i campioni) da analizzare, ecc.
Alcuni esempi di falsi positivi e falsi negativi:
codice:
<a href="foo" title="bar</a>">link</a>
In questa stringa, nonostante il tag in sé sia valido e chiuso perfettamente, verrà trovato <a href="foo" title="bar</a> perché il valore di un attributo presenta la stringa "</a>". Si ha quindi un falso positivo.
codice:
<a href="foo" title="->"link</a>
Questo non viene rilevato nonostante sia un caso in cui il tag non è correttamente chiuso, e debba quindi essere trovato. Infatti un attributo presenta la parentesi angolare chiusa, cioè lo stesso carattere che dovrebbe delimitare il tag di apertura. Si ha quindi un falso negativo.
E' chiaro che si tratta di casi particolari e che nello specifico, per i caratteri speciali dentro gli attributi, sarebbe opportuno utilizzare le entità HTML.
Possono presentarsi però altri casi più consueti:
codice:
<a id="bar" href="foo"<i>link</i></a>
Il tag <a> è malformato e risulta non valido. Potrebbe benissimo rientrare tra i casi simili al tuo esempio; il problema è che la regex generale non lo rileva perché viene fregata da quel tag <i> annidato. Si ha quindi un falso negativo. Vuoi che sia trovato oppure no?
codice:
<a href="foo" title="bar>link</a>
Qui è presente la chiusura del tag per cui, dalle tue indicazioni, questa occorrenza non dovrebbe essere trovata dalla regex (e di fatto è così). Però il problema è che mancano le virgolette di chiusura dell'attributo title, per cui l'intero tag, e tutto ciò che gli viene dopo, è compromesso rendendo non valido il codice HTML. Questo tag verrà addirittura ignorato dai browser. Vuoi che sia trovato oppure no?
codice:
<a href="foo" title=>link</a>
Anche qui è presente la chiusura del tag ma manca il valore dell'attributo title che genera un errore di validazione, nonostante i browser riescano a risolverlo. Anche questo caso non viene rilevato dalla regex, secondo le tue indicazioni. Vuoi che sia trovato oppure no?
Potrebbero esserci ancora tante altre casistiche per le quali potresti aver bisogno di una regex ben più complessa. In tal caso dovresti stilare e fornire, come già accennato, un elenco di tutte le possibili ed eventuali casistiche che vuoi siano trovate e di quelle che vuoi non siano trovate; diversamente è difficile ottenere un aiuto mirato.
Poi, non so, magari ti è sufficiente anche solo quella regex generale
Fai sapere.