【问题标题】:Regex html script tag with specific URL具有特定 URL 的正则表达式 html 脚本标记
【发布时间】:2014-04-30 23:36:24
【问题描述】:

我有一个带有<script> 标签的html 内容。在那些<script> 标签中,我 有一个指向视频的网址。

我想要的是用我使用这种模式的特定标签替换那些 html 标签:[VIDEO]MY_URL_[/VIDEO]

我正在使用 hpple 来解析 html 内容。

我正在使用这个 xPath 查询://脚本

当解析器为我的查询找到结果时,我正在使用此函数来提取视频网址:

NSDataDetector* detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
NSArray* matches         = [detector matchesInString:raw options:0 range:NSMakeRange(0, [raw length])];
NSString *finalUrl = [self urlMatchingRegexResults:matches withExtensionArray:[self videosExtensionsArray]];

if (finalUrl) {

        NSString *replacement = [NSString stringWithFormat:@"[%@]%@[/%@]",tag,finalUrl,tag];
        NSString *pattern = [NSString stringWithFormat:@"<script.*>.*%@.*</script>",finalUrl];

        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil];
        NSArray *matches = [regex matchesInString:self.store options:0 range:NSMakeRange(0, self.store.length)];
        modifiedString = [regex stringByReplacingMatchesInString: modifiedString options:0 range:NSMakeRange(0, modifiedString.length) withTemplate:replacement];
}

其中“raw”是 [TFHppleElement raw] 的结果 其中 [self videosExtensionsArray] 是一个视频扩展数组:

- (NSArray *)videosExtensionsArray {


    static NSArray *videosExtensionsArray;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        videosExtensionsArray =  @[@"mp4",@"mov",@"avi",@"flv",@"mkv"];

    });

    return videosExtensionsArray;
}

问题是,如果我的 html 内容中有多个标签,我的正则表达式会采用第一个开始标签并采用最后一个结束标签。

如何修改我的正则表达式以避免这个问题?

NSString *pattern = [NSString stringWithFormat:@"<script.*>.*%@.*<\\/script>",finalUrl];

编辑:

HTML 内容:

<html><body><p style="text-align: center;"><a href="http://www.tuxboard.com/nba-jam-avec-gerald-green/gerald-green-nba-jam/" rel="attachment wp-att-171429">[IMG]http://www.tuxboard.com/photos/2014/03/Gerald-Green-NBA-Jam.jpg[/IMG]
</a>
</p>
<p><span id="more-171399"/><br/>
Si le jeu <strong>NBA Jam</strong> était édité cette année, le joueur des Phoenix Suns <strong>Gerald Green</strong> serait la star en couverture. L’arrière des Suns est à la fois un immense dunkeur avec une <a href="http://www.tuxboard.com/la-detente-de-gerald-green/" target="_blank">détente phénoménale</a>, mais aussi une fine gâchette.</p>
<p style="text-align: center;"><a href="http://www.tuxboard.com/nba-jam-avec-gerald-green/video-nba-jam-gerald-green/" rel="attachment wp-att-171431">[IMG]http://www.tuxboard.com/photos/2014/03/Video-NBA-Jam-Gerald-Green.jpg[/IMG]
</a>
</p>
<p>L’équipe de Phoenix l’a intégré dans le jeu <strong>NBA Jam</strong>, suite à ses <a href="http://www.tuxboard.com/plus-lourde-defaite-de-lhistoire-des-lakers-et-duel-spurs-heat/" target="_blank">performances hors normes face au Thunder</a> avec notamment 41 pts.    </p>
<p>On vous laisse savourer cette vidéo, avec une jolie pépite à la fin (on n’en dit pas plus…)</p>
<div id="tuxplayer">Chargement du player …</div>
<p><script type="text/javascript"><![CDATA[jwplayer("tuxplayer").setup({ flashplayer: "http://medias.tuxboard.com/playerv2.swf", file: "http://medias2.tuxboard.com/NBA_Jam_Gerald_Green.mp4",image: "http://www.tuxboard.com/photos/2014/03/NBA-Jam-Gerald-Green-on-Fire-640x357.jpg", height: 370,width: '100%', 'plugins': 'sharing-3'});]]></script></p>
<p>
Les dernières actions du bonhomme qui devrait remporter le titre du joueur ayant le plus progressé !</p>
<p style="text-align: center;">[IMG]http://www.tuxboard.com/photos/2014/03/Gerald-Green-Poster-Mason-Plumlee.gif[/IMG]
</p>
<p style="text-align: center;">[IMG]http://www.tuxboard.com/photos/2013/11/Dunk-Gerald-Green.gif[/IMG]
</p>
<p style="text-align: center;">[IMG]http://www.tuxboard.com/photos/2014/01/gerald-green-windmill.gif[/IMG]
</p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/xnzQ3FWc7Oo?feature=oembed" frameborder="0" allowfullscreen=""/></p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/Yyr6mkAbCQw?feature=oembed" frameborder="0" allowfullscreen=""/></p>
<p>Et surement son plus beau dunk :</p>
<p style="text-align: center;">
</p><div id="Gerald">Chargement du player …</div>
<p><script type="text/javascript"><![CDATA[
jwplayer("Gerald").setup({ flashplayer: "http://medias.tuxboard.com/playerv2.swf", file: "http://medias2.tuxboard.com/Gerald_Green_Windmill_Alley-Oop.mp4",image: "http://www.tuxboard.com/photos/2012/03/Video-Gerald-GreenAlley-Oop.jpg", height: 390,width: 640, 'plugins': 'sharing-3'});]]></script></p>
</body></html>

模式日志:

<script.*?>.*http://medias2.tuxboard.com/NBA_Jam_Gerald_Green.mp4.*?</script>

【问题讨论】:

    标签: html objective-c regex


    【解决方案1】:

    匹配通常会找到最长的匹配项,您需要最短的匹配项,*? 表示最短的零个或多个。请参阅 Apple 的“NSRegularExpression”文档引用的Regular Expressions - ICU User Guide。

    【讨论】:

    • 像这样:@".*?%@.*?" ?
    • 我看到您匹配的是“”,反斜杠是否应该存在?未能将您的原始 HTML 放入 TextWrangler(或其他优秀的编辑器,并在其中构建您的 RE。一旦它与您需要传输到代码的内容匹配(如果需要,翻译 RE 语法)。
    • 我不明白...在freeformatter.com/regex-tester.html 上,正则表达式似乎可以工作,但在我执行代码时却不行...即使我从结束 标记中删除“\”
    • 在您的问题中添加一个 HTML 样本,其中包含您要匹配的内容以及 NSLoging pattern 的结果,然后有人可能会发现剩下的问题
    • 如果您使用 hpple 并执行查询 //script 那么您应该获取元素数组,每个脚本标签一个。因此,如果您将 RE 应用于这些元素,则您的 RE 一次无法匹配多个脚本标签的内容。要使匹配跨越多个脚本标签,您必须在完整的原始 HTML 上进行操作。即使这样 dot 不默认匹配换行符,为了跨越脚本标签,它们都需要在同一行上。 (续...)
    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多