2009-06-08 5 views
1

Я хочу извлечь http-ссылку из тегов привязки? Расширение, которое нужно извлечь, должно быть только в файлах WMV.Регулярное выражение для извлечения Url из привязывающего тега

+0

У вас есть пример того, что вы пытаетесь найти? –

+0

Я пытаюсь соответствовать следующим образом: listbox selection video мне нужно регулярное выражение, которое должно дать мне: http://www.highoncoding.com/videos/ListBoxSelection.wmv Спасибо, – azamsharp

ответ

1

Regex:

<a\\s*href\\s*=\\s*(?:(\"|\')(?<link>[^\"]*.wmv)(\"|\'))\\s*>(?<name>.*)\\s*</a> 

[Примечание:. \ S * используется в нескольких местах, чтобы соответствовать дополнительные пробельные символы, которые могут возникнуть в HTML]

Пример кода # C:

/// <summary> 
/// Assigns proper values to link and name, if the htmlId matches the pattern 
/// Matches only for .wmv files 
/// </summary> 
/// <returns>true if success, false otherwise</returns> 
public static bool TryGetHrefDetailsWMV(string htmlATag, out string wmvLink, out string name) 
{ 
    wmvLink = null; 
    name = null; 

    string pattern = "<a\\s*href\\s*=\\s*(?:(\"|\')(?<link>[^\"]*.wmv)(\"|\'))\\s*>(?<name>.*)\\s*</a>"; 

    if (Regex.IsMatch(htmlATag, pattern)) 
    { 
     Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); 
     wmvLink = r.Match(htmlATag).Result("${link}"); 
     name = r.Match(htmlATag).Result("${name}"); 
     return true; 
    } 
    else 
     return false; 
} 

MyRegEx.TryGetHrefDetailsWMV("<td><a href='/path/to/file'>Name of File</a></td>", 
       out wmvLink, out name); // No match 
MyRegEx.TryGetHrefDetailsWMV("<td><a href='/path/to/file.wmv'>Name of File</a></td>", 
       out wmvLink, out name); // Match 
MyRegEx.TryGetHrefDetailsWMV("<td><a href='/path/to/file.wmv' >Name of File</a></td>", out wmvLink, out name); // Match 
2

Поскольку синтаксические правила HTML настолько свободны, это довольно сложно сделать с любой надежностью (если, скажем, вы абсолютно не знаете, что все ваши теги будут использовать двойные кавычки вокруг значений их атрибутов). Вот некоторые довольно общее регулярное выражение на основе кода для этой цели:

function extract_urls($html) { 
    $html = preg_replace('<!--.*?-->', '', $html); 
    preg_match_all('/<a\s+[^>]*href="([^"]+)"[^>]*>/is', $html, $matches); 
    foreach($matches[1] as $url) { 
     $url = str_replace('&amp;', '&', trim($url)); 
     if(preg_match('/\.wmv\b/i', $url) && !in_array($url, $urls)) 
      $urls[] = $url; 
    } 
    preg_match_all('/<a\s+[^>]*href=\'([^\']+)\'[^>]*>/is', $html, $matches); 
    foreach($matches[1] as $url) { 
     $url = str_replace('&amp;', '&', trim($url)); 
     if(preg_match('/\.wmv\b/i', $url) && !in_array($url, $urls)) 
      $urls[] = $url; 
    } 
    preg_match_all('/<a\s+[^>]*href=([^"\'][^> ]*)[^>]*>/is', $html, $matches); 
    foreach($matches[1] as $url) { 
     $url = str_replace('&amp;', '&', trim($url)); 
     if(preg_match('/\.wmv\b/i', $url) && !in_array($url, $urls)) 
      $urls[] = $url; 
    } 
    return $urls; 
} 
1

Я бы не сделать это с помощью регулярных выражений - я бы, вероятно, использовать JQuery:

jQuery('a[href$=.wmv]').attr('href') 

Сравните это упрощенно регулярное выражение, например хаоса, который (как указано) не касается суетливой/сложной разметки, и вы, надеюсь, поймете, почему парсер DOM лучше, чем регулярное выражение для этого типа проблем.

+0

Я хотел бы возвысишь это не один раз :) –

Смежные вопросы