- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以我正在构建一个小型 CMS,我想避免在内容编辑器中使用 HTML。出于这个原因,我想检测文本中的原始 URL 以及支持类似 BB 的标签,以实现更好的自定义。
www.example.com
[link http://www.example.com]Click me[/link]
不幸的是,我对正则表达式还很陌生,我似乎无法让它正常工作。我在字符串上运行两个正则表达式:第一个检测原始 URL,第二个检测类似 BB 的 URL。后者似乎工作得很好,但第一个会干扰,并且也会转换包含在标签中的 URL。
我从找到的一段代码开始 here并做了一些补充。
这是非标记 URL 的代码:
/* don't match URLs preceeded by '[link ' */
(?<!\[link\s)
(
/* match all combinations of protocol and www. */
(\bhttps?://www\.|\bhttps?://|(?<!//)\bwww\.)
/* match URL (no changes made here) */
([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
/* but don't match if followed by [/link] - THIS DOESN'T WORK */
(?!\[/link\])
)
www.
之前的负面回顾是因为 /
不是单词字符,没有它就像
[link http://www.example.com]example[/link]
仍会在 http://
之后匹配。
上面的正则表达式产生了以下匹配(用 http://gskinner.com/RegExr/ 测试,匹配是粗体。我不得不在 http://
之后添加空格,因为我不允许发布更多网址):
www.example.com
http:// www.example.com
http:// example.com
[link http://www.example.com]no problem 1[/link]
[link www.example.com]no problem 2[/link]
[link http://www.example.com]http://www.example.com[/link]
我试过移动否定的前瞻性并使用括号(非常漫无目的地),但没有成功。
为了完整起见,这里是标签匹配正则表达式(似乎有效):
(?:\[link\s)(\bhttps?://|\bwww\.|\bhttps?://www\.)([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))\](.*)(?:\[/link\])
我相信有人可以立即发现错误。
提前致谢!
最佳答案
我已经采用了您的正则表达式,将其与您提供的示例一起插入到 regexr 中并尝试使其工作。
一步一步:
1) 原始正则表达式:http://regexr.com?33snj .为什么这个正则表达式也匹配 [/link] 的问题在于 URL 匹配位:
[^\s()<>]+
这也会匹配左括号字符'[',因此匹配不会在遇到[/link]位时停止。可以说 [ 字符是一个有效的 URI 字符,但这只是在极少数情况下(有关更多信息,请参阅 this stackoverflow 帖子)。
2) 我决定继续使用您的正则表达式,但将左括号字符添加到否定字符列表中:
[^\s()<>[]+
这会让你陷入另一个问题。参见 http://regexr.com?33snp .由于回溯,引擎现在找到了一种方法来绕过最后的否定前瞻。
3) 一旦您使 URL 匹配组原子化(通过将 ?> 添加到捕获组的开头),引擎就会停止回溯,我们已经达到了预期的结果。
(?<!\[link\s)((\bhttps?://www\.|\bhttps?://|(?<!//)\bwww\.)(?>[^\s()<>[]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))(?!\[/link\]))
查看实际效果 http://regexr.com?33sns .
关于php - URL 检测和 BB-Style 标签(正则表达式,前瞻问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15005621/
我有这个简短的代码片段: unsigned BB[] = ???; printf("%s\n", (char *) (BB + 1)); 我希望 printf 的输出是“Red Ross!”。我不
这个问题在这里已经有了答案: Is gcc 4.8 or earlier buggy about regular expressions? (3 个答案) 关闭 8 年前。 我在 c++11 (ub
如何对列表进行排序以结束: ['a', 'aa', 'aaa', 'A', 'AA', 'AAA', 'b', 'bb', 'bbb', 'B', 'BB', 'BBB'] 为方便起见,假设它是一个随
将 contains 定义为 contains[BB >: B](e: BB): Boolean 而不是 contains(e: Any) 有什么好处: Scala 中的 bool 值。 Either
我知道我可以用: string input = "AA,BB,CC"; string output = ""; foreach (var item in
假设我有一个稀疏矩阵 A,我想计算一个矩阵 B 使得 B.T.dot(B) = A scipy 模块中是否有任何函数可以做到这一点?如果不是,是否可以在 numpy 中实现? 最佳答案 此功能在 nu
有人知道这个错误是什么意思吗?当我尝试反汇编由 LLVMWriteBitcodeToFile 写入的文件时出现错误。当我使用 LLVMDumpModule 转储模块并手动组装和反汇编文件时,不会发生错
我正在使用JXA在BB的XMPP客户端上工作,但是JXA api需要花费一些时间从inputstream读取并在2分钟后通过超时错误。我用J2ME编写了单独的套接字程序,并在BB仿真器中执行,它可以交
JSFiddle Link: bootbox.alert 应显示在 bootbox.dialog 之前。我已将所有库预加载到 JSFiddle 中。我希望在单击 bootbox.alert 后显示 b
我在我的应用程序中使用 DateTimePicker,我希望它只允许选择过去的日期,我用它来允许用户选择他的出生日期,我希望它在给定年份开始和结束。 最佳答案 好吧,快速浏览一下 DateTimePi
我想在位图上绘制位图..我不知道我做错了什么,因为我希望这能起作用。有人可以指出我的错误吗?所以我想在bitmapImage上绘制bitmapImage2。我相信我的错在于 Graphics.crea
我目前正在实现一个易于编辑的 BB 代码脚本,该脚本是用 Jquery/Javascript 编写的。唯一的问题是它并不像我想要的那么容易,所以我需要一些帮助。 该脚本运行良好(将内容添加到文本区域)
我正在尝试通过 Javascript 删除 BBCode 标签,但我无法理解如何操作。 将所有标签添加到数组中,例如: var bbcodes = ["[b]", "[/b]"]; 然后搜索我的文本并
在 stackoverflow 用户的帮助下,我几乎解决了我的代码问题,但现在遇到了不同的问题。我的代码现在看起来像这样: #include #include #include using na
我正在尝试创建一个函数来计算两个边界框之间的交集比。我有关于两个矩形的 Rect 信息。我创建了一个交集函数,它返回两个框之间的双倍交集分数: double Detection::overlapBB(
我这里有一些使用了 boost::regex::perl 的遗留代码,但注释不当。我之前对一个特定的构造感到疑惑,但由于代码(或多或少)起作用了,我不愿意碰它。 现在我不得不触摸它,出于技术原因(更准
我预计以下内容会起作用(确实如此): x = '"aa","bb","cc"' x =~ /\A(".*?",){2}".*?"\Z/ #=> 0 ...但我没想到以下两个会起作用(并且不希望它们起作
我一直致力于在 BlackBerry OS5 设备(8530)上调试一些 jQuery。有很多问题,但我已经缩小了一个与 jQuery 的 .each() 有关的问题 逻辑是这样的: $objectA
1)放置在管理器中的字段在该管理器中具有固定位置。 2)当用户滚动屏幕时,该字段将沿着可见屏幕移动(尽管他在管理器中的位置保持固定)。 当用户 ScrollView 并将焦点放在字段上时,如何获取字段
请检查一下 BasicEditField demo = ew BasicEditField("", number, 15, BasicEditField.FILTER_
我是一名优秀的程序员,十分优秀!