Lorsque vous [^mydomain.*\"\']
vous disent « correspond à tout caractère sauf un littéral 'm', 'y', 'd', 'o', ..., '', '*', etc.
Essayez quelque chose comme:
#<a [^>]*\bhref=(['"])http.?://((?!mydomain)[^'"])+\1 *>.*?</a>#i
notes:
- Je retournai votre
a.*href
-a [^>]*\bhref
pour vous assurer que le « a » et « href » sont des mots entiers et que l'expression rationnelle ne correspond pas à sur plusieurs tags
- J'ai changé le délimiteur regex à « # » au lieu de «/» de sorte que vous ne devez pas échapper à la
/
plus
- Notez le
((?!mydomain)[^'"])+
. Cela signifie « match de [^ ' « ] + qui n'est pas myDomain ». Le (?!
est appelé
négatif look-ahead.
- Notez le
\1
. Cela fait en sorte que la marque de devis de clôture pour l'URL est la même comme la marque de citation d'ouverture (voir hwo la première série de crochets capture le ['"]
?). vous seriez probablement bien sans elle si vous préférions.
pour PHP (mis à jour parce que je mélange toujours quand antislashs doivent être échappé en PHP - voir le commentaire @ GlitchMr ci-dessous):
$pattern = '#<a [^>]*\bhref=([\'"])http.?://((?!mydomain)[^\'"])+\1 *>.*?</a>#i';
Voir dans l'action here, où vous pouvez le modifier à vos fins.
S'il s'agit d'une entrée d'utilisateur que vous voulez nettoyer, vous devrez également gérer des guillemets d'attribut absents ou un masquage d'entité HTML. Une regex n'atteindra donc que les cas communs; ce n'est pas adapté comme filtre fiable. (Sans effort désordonné qui est.) – mario
duplication possible de [Comment analyser et traiter le code HTML avec PHP?] (Http://stackoverflow.com/questions/3577641/how-to-parse-and-process-html-with- php) – Gordon
@Gordon: Je pense qu'il ne sera pas facile de l'analyser car je reçois la balise dans le cadre d'une chaîne qui a déjà passé un filtre – lvil