Iphone 标记文本解析器,如stackoverflow';Objective-C中的s格式化程序
我正在Objective C中创建标记编辑器。我需要以下功能:Iphone 标记文本解析器,如stackoverflow';Objective-C中的s格式化程序,iphone,markup,Iphone,Markup,我正在Objective C中创建标记编辑器。我需要以下功能: 识别块的分界,例如**块** 删除开始和结束“标记”,例如“下一个文本为**粗体**”变为“下一个文本为粗体” 确定新上下文中标记文本的开始和结束位置:“下一个文本为粗体” 编辑: 由于我将来可能会扩展语法(目前将非常有限),因此解析必须是自上而下的,以便文本的开始和结束位置始终与生成的文本相对应。因此,正则表达式可能不是最好的解决方案 做这件事的最佳方法是什么?最后,我们使用 下面的代码没有经过完全测试,但确实适用于St3fa
- 识别块的分界,例如
**块**
- 删除开始和结束“标记”,例如“下一个文本为
”变为“下一个文本为粗体”**粗体**
- 确定新上下文中标记文本的开始和结束位置:“下一个文本为粗体”
做这件事的最佳方法是什么?最后,我们使用 下面的代码没有经过完全测试,但确实适用于St3fan指出的情况
- (NSArray *) scanContent:(NSMutableString **)content {
NSMutableArray *tokens = [[NSMutableArray alloc] init];
NSArray *captureRegex = [[NSArray alloc] initWithObjects:
@"\\[\\[(.*?)\\]\\]",@"\\*\\*(.*?)\\*\\*", nil];
NSArray *tokenID = [[NSArray alloc] initWithObjects:
@"Italic",@"Bold", nil];
int index = 0;
for (NSString*capture in captureRegex) {
NSRange captureRange;
NSRange stringRange;
stringRange.location = 0;
stringRange.length = [*content length];
do {
captureRange = [*content rangeOfRegex:capture inRange:stringRange];
if ( captureRange.location != NSNotFound ) {
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setObject:[tokenID objectAtIndex:index] forKey:@"Token"];
[dictionary setObject:[NSNumber numberWithInt:captureRange.location]
forKey:@"Start"];
[dictionary setObject:[NSNumber numberWithInt:captureRange.length]
forKey:@"Length"];
[tokens addObject:dictionary];
for (NSMutableDictionary *dict in tokens) {
NSNumber *nRange = [dict objectForKey:@"Start"];
int start = [nRange intValue];
if (start > captureRange.location) {
nRange = [NSNumber numberWithInt:start - 4]; // Removing 4 characters
[dict setObject:nRange forKey:@"Start"];
}
if (start == captureRange.location) {
NSString *data = [*content stringByMatching:capture options:RKLMultiline inRange:captureRange capture:1 error:NULL];
NSLog(@"data: %@",data);
[*content replaceOccurrencesOfRegex:capture withString:data range:captureRange];
NSLog(@"Replaced Content: %@",*content);
}
}
stringRange.location = captureRange.location + captureRange.length -4;
stringRange.length = [*content length] - stringRange.location;
}
}
while ( captureRange.location != NSNotFound );
index++;
}
return tokens;
}
StackExchange网站上使用的降价处理器MarkDown Sharp是。看一看,也许你可以看到他们是如何做到的,或者把它移植到objective-c 也许更好的是,看看这个问题:
它链接到一个名为的开源应用程序,该应用程序使用了一个名为折扣的降价C实现,还为它提供了一个objective-C包装器。为什么您认为正则表达式不是正确的解决方案?在我看来,创建一个工作良好的格式解析器就像是“唯一的解决方案”。您可以使用一些关于bb代码的示例代码来创建wiki变体。给你一个小例子:text:*bold**,regex:\*\*([^\*]+)\*\*,结果是$1=bold。我想你是对的。我在想,如果我匹配一个粗体块,然后再匹配一个斜体块,那么我的索引就错了,但是我可以根据起始位置减去字符的差异。你当然不需要正则表达式来做这件事。您还可以使用ANTLR或Bison之类的工具来实现此目的。它很快就变得复杂起来,您如何用正则表达式解析
**3*5**
?(在此有效)基于Blaenk的代码