2009-05-18 8 views
1

Je veux couper tous les URL comme et de les remplacer sur les ancres <a></a> mais mes besoins (http://....): Ne touchez pas les ancres et la définition de page (type Doc) comme:Comment écrire correctement Regex pour url sur la page sans ancres?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

donc je dois trouver simplement le texte brut avec URL ...

Je suis en train de passer outre mon render page intérieure et je fait BrowserAdapter:

<browser refID="default"> 
    <controlAdapters> 
     <adapter controlType="System.Web.Mvc.ViewPage" 
       adapterType="Facad.Adapters.AnchorAdapter" /> 
    </controlAdapters> 
</browser> 

il ressemble à ceci:

public class AnchorAdapter : PageAdapter 
{ 
    protected override void Render(HtmlTextWriter writer) 
    { 
     /* Get page output into string */ 
     var sb = new StringBuilder(); 
     TextWriter tw = new StringWriter(sb); 
     var htw = new HtmlTextWriter(tw); 

     // Render into my writer 
     base.Render(htw); 

     string page = sb.ToString(); 
     //regular expression 
     Regex regx = new Regex("http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", RegexOptions.IgnoreCase); 

     //get the first match 
     Match match = regx.Match(page); 

     //loop through matches 
     while (match.Success) 
     { 

      //output the match info 
      System.Web.HttpContext.Current.Response.Write("<p>url match: " + match.Groups[0].Value+"</p>"); 

      //get next match 
      match = match.NextMatch(); 
     } 

     writer.Write(page); 
    } 
} 

Répondre

1

Il vous suffit de chercher un peu devant et derrière l'URL pour voir si elle est entre guillemets, il est peu probable que quelqu'un aurait coller une URL cité en texte brut, mais sont toujours urls cité dans les balises et doctypes. Ainsi, votre regex devient:

(^|[^'"])(http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?)([^'"]+|$) 

(^ | [^ '"] +) signifie début de chaîne ou un caractère qui n'est pas une citation ([^'"] | $) signifie la fin de chaîne ou non une citation

les supports supplémentaires autour de l'ancien regex vous assurer qu'il est un groupe de capture de sorte que vous pouvez récupérer l'URL avec \ 2 (groupe 2) au lieu d'obtenir la merde supplémentaire, il aurait peut-être égalés sur les bords de l'url

BTW, votre URL regex semble très mauvais, il existe des formes plus compactes et précises. Vous n'avez vraiment pas besoin d'échapper à TOUT.

+0

Pourriez-vous fournir des échantillons de bonne regex – omoto

Questions connexes