我目前正在研究一种替换网页中特定文本的方法,但我不想搞乱任何可能用作标记的东西(即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有效负载而不是支持标签?
答案 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>