Preg_replace str如果没有紧跟str

时间:2016-09-05 08:59:08

标签: php regex preg-replace

我已经尝试了2个小时,但我似乎无法正确掌握正则表达式。我想从字符串中替换所有html注释,但前提是字符串不是由<br>标记立即取代。

我已经很好地完成了以下工作,从字符串中删除所有html注释:

preg_replace('/<!--.*?-->/s', '', $str);

我正在尝试添加,以便在<br>标记立即成功后不会替换注释。我在想这样的事情(显然是错的),但无法绕过它:

preg_replace('/<!--.*?-->(?!<br>)/s', '', $str);

任何指导意见。

1 个答案:

答案 0 :(得分:2)

延迟点模式将匹配尽可能少的字符,直到与后续模式匹配的第一个子字符串,在您的情况下,这意味着一旦找到Library Project,匹配的字符串{{ 1}}将是匹配private func requestContactsAccess() { //store = CNContactStore() store.requestAccessForEntityType(.Contacts) {granted, error in if granted { dispatch_async(dispatch_get_main_queue()) { self.accessGrantedForContacts() return } } } } 未跟随<!-- 的下一个匹配,即使它是下一个评论的结束评论分隔符。

您需要做的是确保.*?-->不匹配。使用<br> tempered greedy token或其展开版本:

.*?

请参阅regex demo

-->模式匹配(?:(?!-->).)*'~<!--[^-]*(?:-(?!->)[^-]*)*-->(?!<br>)~s' )以外的任何0 +字符,然后[^-]*(?:-(?!->)[^-]*)*的0 +序列不跟-一致(请参阅[^-]*),然后是-以外的0 +字符。

->淬火贪婪令牌匹配任何未启动-(?!->)序列(-)的字符((?:(?!-->).)*),零次或多次({{1} })。