替换未标记的'网页中的内容

时间:2015-04-12 12:27:12

标签: html ios regex parsing

我目前正在研究一种替换网页中特定文本的方法,但我不想搞乱任何可能用作标记的东西(即HTML本身)。我已经看了很多方法,包括匹配'<'和'>'字符(并忽略它们之间的内容),但不幸的是,当网页形成不良而且它们不匹配,或内容不佳,或者存在嵌入的'<'时,这会中断或'>'在实际文本中。它也非常慢。

提取特定文本不是目标。相反,我需要用不同的文本替换它。

//编辑以使更清楚(不知道为什么我为这个问题得到两个-1)。

1)这是一个非常简单的例子

<head>
    <title>This is my website</title>
    <link rel="shortcut icon" href="//a.b.c">
    <meta name="twitter:card" content="summary">
    <meta property="og:type" content="website" />
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script>
        mystuff.ready(function () {    
            mystuff.using("snippets", function () {
                mystuff.snippets.initSnippetRenderer();
            });   
        });
    </script>    
</head>
<body class="question-page new-topbar">
    <noscript><div id="noscript-padding"></div></noscript>
    <div id="notify-container"></div>
    <h1>This is piece of large text</h1>
    <ul>
        <li>Coffee</li>
        <li>Tea</li>
        <li>Milk</li>
    </ul>
</body>

当您打开浏览器时,您希望在浏览器中看到以下内容(让我们称之为'感兴趣的文本'):

This is a Large Piece of Text
* Coffee
* Tea
* Milk

因此,我感兴趣的关键是如何确定标签之外的内容(即感兴趣的文本,并允许使用RegEX进行搜索和替换)。

2)。 @Zaph - stringByReplacingOccurrencesOfString:withString:options:range不足,因为它不能直接确定范围是什么。范围取决于文本是否包含在HTML标记中,还是由标记操作的有效负载) - 请参阅上面的“1”点。

如果我使用文本“网站”的直接替换,那么它将替换标题中的文本,但它也会错误地替换第二个元标记中的术语,这是不行的。

任何想法,或者我还有什么想法可以智能地处理HTML有效负载而不是支持标签?

1 个答案:

答案 0 :(得分:1)

使用带有Look-behind和Look-ahead断言的正则表达式。

该示例将匹配的文本替换为自身,但包含在邪恶的表情符号中。关键是要展示匹配模式。使用NSRegularExpression可以更好地控制替换。

说明:

(?<=>) Must be preceded with: >
\\S Must start with a non-whitespace character (the \ has to be escaped)
[^<>]+ Must consist of characters except < and >
(?=</) Must be followed by </

NSString *html = <question html>;

NSString *pattern = @"(?<=>)\\S[^<>]+(?=</)";
NSString *replacement = @"$0";
html = [html stringByReplacingOccurrencesOfString:pattern
                                       withString:replacement
                                          options:NSRegularExpressionSearch
                                            range:NSMakeRange(0, html.length)]
NSLog(@"html:\n%@", html);

输出:

<head>
    <title>This is my website</title>
    <link rel="shortcut icon" href="//a.b.c">
    <meta name="twitter:card" content="summary">
    <meta property="og:type" content="website" />
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script>
        mystuff.ready(function () {    
            mystuff.using("snippets", function () {
                mystuff.snippets.initSnippetRenderer();
            });   
        });
    </script>    
</head>
<body class="question-page new-topbar">
    <noscript><div id="noscript-padding"></div></noscript>
    <div id="notify-container"></div>
    <h1>This is piece of large text</h1>
    <ul>
        <li>Coffee</li>
        <li>Tea</li>
        <li>Milk</li>
    </ul>
</body>