iOS 計算富文本,檢索網址,號碼,表情,并且計算高度,設置最大行數

fuwb.gif

前言:項目中用到檢索表情,網址與號碼,但是看了TTTAttributeLabel,emojyLabel,奈何都不太滿意,plist格式不太符合,而且這兩個第三方用到檢索都是系統自帶的檢索,檢測網址方面不準確, 所以就需要自己使用正則進行檢索。

關于以上兩個三方檢索不準確的可以參考:檢索網址

接下來寫一下實現的過程, 沒有高度封裝,僅供參考

關于網址與號碼的正則再說明下:
網址:KURlREGULAR @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(((http[s]{0,1}|ftp)://|)((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"
號碼: KPHONENUMBERREGLAR @"\\d{3}-\\d{8}|\\d{4}-\\d{7}|\\d{11}"
比如我要轉的字符串為
@"簡書:http://jianshu.com哈哈哈[調皮][流汗][偷笑][再見][可愛][色][害羞][委屈][委屈][抓狂][酷][酷][噓][噓][齜牙][大哭][大哭][大哭][齜牙][噓][噓][調皮][調皮]哈哈哈哈[噓][調皮][調皮]18637963241他大舅他二舅都是舅,高桌子地板頭都是木頭"

我需要做的是檢索網址并且替換為和微博一樣的鏈接,號碼和鏈接有選中狀態,因為UITextview有檢測url 的方法可以添加點擊事件,所以就采用UITextview進行封裝。主要采取正則表達式與RegexKitLite配合做檢索

1 . 首先建立一個模型,把文字檢索為富文本,檢索出 表情,網址以及號碼。中間需要使用一個模型存儲檢索出來的結果。對于特殊符號的表情建立一個模型。其實富文本的都是逐個檢索,然后處理,最后拼接為一個NSMutableAttributedString。


#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface ZLStatus : NSObject
//源內容
@property (nonatomic, copy) NSString *text;

/** string  信息內容 -- 帶有屬性的(特殊文字會高亮顯示\顯示表情)*/
@property (nonatomic, copy) NSAttributedString *attributedText;

@end
#import "ZLStatus.h"
#import "ZLSpecial.h"
#import "ZLTextPart.h"
#import "RegexKitLite.h"
@implementation ZLStatus
- (void)setText:(NSString *)text
{
    _text = [text copy];
    
    // 利用text生成attributedText
    self.attributedText = [self attributedTextWithText:text];
}
/**
 *  普通文字 --> 屬性文字
 *
 *  @param text 普通文字
 *
 *  @return 屬性文字
 */
- (NSAttributedString *)attributedTextWithText:(NSString *)text
{
    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] init];
    
    // 表情的規則
    NSString *emotionPattern = @"\\[[0-9a-zA-Z\\u4e00-\\u9fa5]+\\]";
    // @的規則
    NSString *atPattern = @"@[0-9a-zA-Z\\u4e00-\\u9fa5-_]+";
    // #話題#的規則
    NSString *topicPattern = @"#[0-9a-zA-Z\\u4e00-\\u9fa5]+#";
    // url鏈接的規則
    NSString *urlPattern = @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(((http[s]{0,1}|ftp)://|)((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)";
    NSString *phoneNumber =@"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|1+[3578]+\\d{9}|\\d{8}|\\d{7}"
    ;
    NSString *pattern = [NSString stringWithFormat:@"%@|%@|%@|%@|%@", emotionPattern, atPattern, topicPattern, urlPattern,phoneNumber];
    
    // 遍歷所有的特殊字符串
    NSMutableArray *parts = [NSMutableArray array];
    [text enumerateStringsMatchedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
        if ((*capturedRanges).length == 0) return;
        
        ZLTextPart *part = [[ZLTextPart alloc] init];
        part.special = YES;
        part.text = *capturedStrings;
        part.emotion = [part.text hasPrefix:@"["] && [part.text hasSuffix:@"]"];
        part.range = *capturedRanges;
        [parts addObject:part];
    }];
    // 遍歷所有的非特殊字符
    [text enumerateStringsSeparatedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
        if ((*capturedRanges).length == 0) return;
        
        ZLTextPart *part = [[ZLTextPart alloc] init];
        part.text = *capturedStrings;
        part.range = *capturedRanges;
        [parts addObject:part];
    }];
    
    // 排序
    // 系統是按照從小 -> 大的順序排列對象
    [parts sortUsingComparator:^NSComparisonResult(ZLTextPart *part1, ZLTextPart *part2) {
        // NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending
        // 返回NSOrderedSame:兩個一樣大
        // NSOrderedAscending(升序):part2>part1
        // NSOrderedDescending(降序):part1>part2
        if (part1.range.location > part2.range.location) {
            // part1>part2
            // part1放后面, part2放前面
            return NSOrderedDescending;
        }
        // part1<part2
        // part1放前面, part2放后面
        return NSOrderedAscending;
    }];
    
    UIFont *font = [UIFont systemFontOfSize:15];
    NSMutableArray *specials = [NSMutableArray array];
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"face.plist" ofType:nil];
    NSArray  *face = [NSArray arrayWithContentsOfFile:filePath];
    // 按順序拼接每一段文字
    for (ZLTextPart *part in parts) {
        // 等會需要拼接的子串
        NSAttributedString *substr = nil;
        if (part.isEmotion) { // 表情  表情處理的時候,需要根據你自己的plist進行單獨處理,像一些第三方里自定義的plist,格式要是也是很嚴格的
            NSString *str = [text substringWithRange:part.range];
            for (int i = 0; i < face.count; i ++) {
                if ([face[i][@"face_name"] isEqualToString:str]) {
                    //face[i][@"png"]就是我們要加載的圖片
                    //新建文字附件來存放我們的圖片,iOS7才新加的對象
                    NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
                    //給附件添加圖片
                    textAttachment.image = [UIImage imageNamed:face[i][@"face_image_name"]];
                    //調整一下圖片的位置,如果你的圖片偏上或者偏下,調整一下bounds的y值即可
                    textAttachment.bounds = CGRectMake(0, -6, 25, 25);
                    //把附件轉換成可變字符串,用于替換掉源字符串中的表情文字
                   substr = [NSAttributedString attributedStringWithAttachment:textAttachment];

                    break;
                }
            }

        } else if (part.special) { // 非表情的特殊文字
            NSURL *url =[NSURL URLWithString:part.text];
            if (url.scheme) {
                substr = [[NSAttributedString alloc] initWithString:part.text attributes:@{
                                                                                           NSForegroundColorAttributeName : [UIColor redColor]
                                                                                           }];

               NSString *string =@"網頁鏈接";
                            NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
                                //給附件添加圖片
                                textAttachment.image = [UIImage imageNamed:@"鏈接"];
                                //調整一下圖片的位置,如果你的圖片偏上或者偏下,調整一下bounds的y值即可
                                textAttachment.bounds = CGRectMake(0, -6, 25, 25);
                NSMutableAttributedString *tempAttribute = [[NSMutableAttributedString alloc]initWithAttributedString:[NSAttributedString attributedStringWithAttachment:textAttachment]];
                 NSMutableAttributedString *tempAttribute2 = [[NSMutableAttributedString alloc]initWithAttributedString:[NSAttributedString attributedStringWithAttachment:textAttachment]];
                NSAttributedString *text =[[NSAttributedString alloc]initWithString:string attributes:@{NSForegroundColorAttributeName:[UIColor blueColor]}];
                [tempAttribute appendAttributedString:text];
                substr = [[NSAttributedString alloc]initWithAttributedString:tempAttribute];
                // 創建特殊對象
                
                ZLSpecial *s = [[ZLSpecial alloc] init];
                s.text = string;
              //需要添加附屬圖片的長度,負責點擊范圍會變化
                NSUInteger loc = attributedText.length+tempAttribute2.length;
                NSUInteger len = string.length;
                s.range = NSMakeRange(loc, len);
                s.urlString = part.text;
                [specials addObject:s];
            }else{
                
                NSLog(@"%@",part.text);
                substr = [[NSAttributedString alloc] initWithString:part.text attributes:@{
                                                                                           NSForegroundColorAttributeName : [UIColor redColor]
                                                                                           }];
                // 創建特殊對象
                ZLSpecial *s = [[ZLSpecial alloc] init];
                s.text = part.text;
                NSUInteger loc = attributedText.length;
                NSUInteger len = part.text.length;
                s.range = NSMakeRange(loc, len);
                s.urlString = part.text;
                [specials addObject:s];
            }
           
            
           
        } else { // 非特殊文字
            substr = [[NSAttributedString alloc] initWithString:part.text];
        }
        [attributedText appendAttributedString:substr];
    }
    
    // 一定要設置字體,保證計算出來的尺寸是正確的
    [attributedText addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, attributedText.length)];
    [attributedText addAttribute:@"specials" value:specials range:NSMakeRange(0, 1)];
    
    return attributedText;
}
中間存儲檢索結果與特殊字符的model:

#import <Foundation/Foundation.h>

@interface ZLTextPart : NSObject
/** 這段文字的內容 */
@property (nonatomic, copy) NSString *text;
/** 這段文字的范圍 */
@property (nonatomic, assign) NSRange range;
/** 是否為特殊文字 */
@property (nonatomic, assign, getter = isSpecical) BOOL special;
/** 是否為表情 */
@property (nonatomic, assign, getter = isEmotion) BOOL emotion;


@end
#import <Foundation/Foundation.h>

@interface ZLSpecial : NSObject
/** 這段特殊文字的內容 */
@property (nonatomic, copy) NSString *text;
/** 這段特殊文字的范圍 */
@property (nonatomic, assign) NSRange range;
@property(nonatomic,copy)NSString *urlString;
設置完內容后我們需要計算內容高度,然后復制給Textview,建立一個Frame模型。
#import <Foundation/Foundation.h>
#import "ZLStatus.h"
@interface ZLFrame : NSObject

//設置

/** 限制最大行數  這一步必須在設置完contentLabelF之后設置*/
@property(nonatomic,assign)int  maxNumLine;
@property(nonatomic,strong)ZLStatus *status;
@property(nonatomic,assign)CGFloat frameX;
@property(nonatomic,assign)CGFloat frameY;
@property(nonatomic,assign)CGFloat maxWidth;
//取值
/**   */
/** 正文 */
@property (nonatomic, assign) CGRect contentLabelF;
@property(nonatomic,assign)CGRect   maxNumLabelF;

@end

#import "ZLFrame.h"
@interface ZLFrame()
//檢測高度的label;
@property(nonatomic,strong)UILabel *templateLabel;
@end
@implementation ZLFrame
-(void)setStatus:(ZLStatus *)status{
    _status = status;
    CGSize contentSize = [status.attributedText boundingRectWithSize:CGSizeMake(self.maxWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;
    self.contentLabelF = (CGRect){{self.frameX , self.frameY}, contentSize};
    
}
-(void)setMaxNumLine:(int)maxNumLine{
    _maxNumLine = maxNumLine;
    
    self.templateLabel.frame =CGRectMake(self.frameX, self.frameY, self.maxWidth, 0);
    self.templateLabel.attributedText = self.status.attributedText;
    self.templateLabel.numberOfLines = maxNumLine;
    [self.templateLabel sizeToFit];
    self.maxNumLabelF = self.templateLabel.frame;
    
}
-(void)setFrameX:(CGFloat)frameX{
    _frameX = frameX;
}
-(void)setFrameY:(CGFloat)frameY{
    _frameY = frameY;
}
-(void)setMaxWidth:(CGFloat)maxWidth{
    _maxWidth = maxWidth;
}

-(UILabel *)templateLabel{
    if (!_templateLabel) {
        _templateLabel =[[UILabel alloc]init];
        
    }
    return _templateLabel;
}
@end

最后自定義Textview,引入Frame模型

#import <UIKit/UIKit.h>
#import "ZLFrame.h"
@interface ZLStatusTextView : UITextView
/** 所有的特殊字符串(里面存放著HWSpecial) */
@property (nonatomic, strong) NSArray *specials;
@property(nonatomic,strong)ZLFrame *zlFrame;
@property(nonatomic,assign)int maxLine;
@property(nonatomic,assign)BOOL isShowAll;//是否全部顯示
@end
#import "ZLStatusTextView.h"
#import "ZLSpecial.h"
#define ZLStatusTextViewCoverTag 999
@implementation ZLStatusTextView
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
        self.editable = NO;
        self.textContainerInset = UIEdgeInsetsMake(0, -5, 0, -5);
        // 禁止滾動, 讓文字完全顯示出來
        self.scrollEnabled = NO;
    }
    return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 觸摸對象
    UITouch *touch = [touches anyObject];
    
    // 觸摸點
    CGPoint point = [touch locationInView:self];
    
    NSArray *specials = [self.attributedText attribute:@"specials" atIndex:0 effectiveRange:NULL];
    BOOL contains = NO;
    
    for (ZLSpecial *special in specials) {
        self.selectedRange = special.range;
        // self.selectedRange --影響--> self.selectedTextRange
        // 獲得選中范圍的矩形框
        NSArray *rects = [self selectionRectsForRange:self.selectedTextRange];
        // 清空選中范圍
        self.selectedRange = NSMakeRange(0, 0);
        
        for (UITextSelectionRect *selectionRect in rects) {
            CGRect rect = selectionRect.rect;
            if (rect.size.width == 0 || rect.size.height == 0) continue;
            
            if (CGRectContainsPoint(rect, point)) { // 點中了某個特殊字符串
                contains = YES;
                break;
            }
        }
        
        if (contains) {
            for (UITextSelectionRect *selectionRect in rects) {
                CGRect rect = selectionRect.rect;
                if (rect.size.width == 0 || rect.size.height == 0) continue;
                
                UIView *cover = [[UIView alloc] init];
                cover.backgroundColor = [UIColor greenColor];
                cover.frame = rect;
                cover.tag = ZLStatusTextViewCoverTag;
                cover.layer.cornerRadius = 5;
                [self insertSubview:cover atIndex:0];
            }
            
            break;
        }
    }
    
    // 在被觸摸的特殊字符串后面顯示一段高亮的背景
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // 觸摸對象
        UITouch *touch = [touches anyObject];
        
        // 觸摸點
        CGPoint point = [touch locationInView:self];
        
        NSArray *specials = [self.attributedText attribute:@"specials" atIndex:0 effectiveRange:NULL];
        BOOL contains = NO;
        
        for (ZLSpecial *special in specials) {
            self.selectedRange = special.range;
            // self.selectedRange --影響--> self.selectedTextRange
            // 獲得選中范圍的矩形框
            NSArray *rects = [self selectionRectsForRange:self.selectedTextRange];
            // 清空選中范圍
            self.selectedRange = NSMakeRange(0, 0);
            
            for (UITextSelectionRect *selectionRect in rects) {
                CGRect rect = selectionRect.rect;
                if (rect.size.width == 0 || rect.size.height == 0) continue;
                
                if (CGRectContainsPoint(rect, point)) { // 點中了某個特殊字符串
                    contains = YES;
                    break;
                }
            }
            
            if (contains) {
                for (UITextSelectionRect *selectionRect in rects) {
                    CGRect rect = selectionRect.rect;
                    if (rect.size.width == 0 || rect.size.height == 0) continue;
                    
                    if (special.urlString) {
                        NSString *urlStr = special.urlString;
                        NSURL *url =[NSURL URLWithString:urlStr];
                        if (url.scheme) {
                            [[UIApplication sharedApplication]openURL:url];
                        }else{
                            NSMutableString *str=[[NSMutableString alloc] initWithFormat:@"tel:%@",special.text];
                            UIWebView *callWebview = [[UIWebView alloc] init];
                            [callWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str]]];
                            [self addSubview:callWebview];
                    }
                    }
                }
                
                break;
            }
        }

        [self touchesCancelled:touches withEvent:event];
    });
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 去掉特殊字符串后面的高亮背景
    for (UIView *child in self.subviews) {
        if (child.tag == ZLStatusTextViewCoverTag) [child removeFromSuperview];
    }
}
-(void)setZlFrame:(ZLFrame *)zlFrame{
    _zlFrame = zlFrame;
    self.attributedText = zlFrame.status.attributedText;
    self.frame = zlFrame.contentLabelF;
    
    
}
-(void)setMaxLine:(int)maxLine{
    _maxLine = maxLine;
    [self.zlFrame setMaxNumLine:maxLine];
    self.frame = self.zlFrame.maxNumLabelF;
}
-(void)setIsShowAll:(BOOL)isShowAll{
    _isShowAll = isShowAll;
    if (isShowAll) {
        self.frame = self.zlFrame.contentLabelF;

    }else{
        [self setMaxLine:3];
    }
}
@end

最后在ViewController里引入即可:

#import "ViewController.h"
#import "ZLStatusTextView.h"
#define kTempText  @"簡書:http://jianshu.com哈哈哈[調皮][流汗][偷笑][再見][可愛][色][害羞][委屈][委屈][抓狂][酷][酷][噓][噓][齜牙][大哭][大哭][大哭][齜牙][噓][噓][調皮][調皮]哈哈哈哈[噓][調皮][調皮]18637963241他大舅他二舅都是舅,高桌子地板頭都是木頭"
#define  KURlREGULAR @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(((http[s]{0,1}|ftp)://|)((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"
#define KPHONENUMBERREGLAR @"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|1+[3578]+\\d{9}|\\d{8}|\\d{7}"
#import "ZLStatus.h"
#import "ZLFrame.h"
#import "LxButton.h"
@interface ViewController ()<UITextViewDelegate>
@property(nonatomic,strong)ZLStatusTextView *textview;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    self.textview =[[ZLStatusTextView alloc]initWithFrame:CGRectMake(20, 100, 250, 200)];
    ZLStatus *status = [[ZLStatus alloc]init];
    status.text = kTempText;
   
   
    ZLFrame *zlFrame =[[ZLFrame alloc]init];
    zlFrame.frameX = self.textview.frame.origin.x;
    zlFrame.frameY = self.textview.frame.origin.y;
    zlFrame.maxWidth = self.textview.frame.size.width;
    zlFrame.status = status;
    
    self.textview.zlFrame = zlFrame;
    //設置最大行數用于展開
    self.textview.maxLine = 3;
    self.textview.isShowAll = YES;
    [self.view addSubview:self.textview];
    self.textview.backgroundColor =[UIColor lightGrayColor];
   
  
    LxButton *button =[LxButton LXButtonWithTitle:@"限制最大行數" titleFont:[UIFont systemFontOfSize:15] Image:nil backgroundImage:nil backgroundColor:[UIColor brownColor] titleColor:[UIColor blueColor] frame:CGRectMake(20, 40, 150, 40)];
    
    [self.view addSubview:button];
    __weak ViewController *weakSelf = self;
    [button addClickBlock:^(UIButton *button) {
       
        weakSelf.textview.isShowAll =!weakSelf.textview.isShowAll;
    }];

}



@end

demo地址:富文本檢索表情,網址,替換鏈接,限制最大輸入行

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容