我对 Regex 的体验不仅仅是介绍,所以这是一个挑战。也许一些数学/物理/某人可以弄清楚...
我们必须用 <span class="tooltip"></span>
包裹某些单词/短语以便为跨度的内容显示相关的工具提示。挑战在于,如果一个词是另一个已经换行的短语的一部分,如何避免不换行两次。
示例:“使用 Twitter 分析器进行分析”。
Twitter 和 Twitter Analyzer 都有工具提示,但只有 Twitter Analyzer 需要包裹在上面。这是通过确保我们首先搜索最长的短语来实现的。
如果两个短语中较短的短语已经被包装在另一个跨度中,您如何防止(仅使用正则表达式)再次包装?
此外,Twitter 和 Twitter Analytics 只是整个列表的两个示例,因此它需要是通用的。
有什么想法吗?
最佳答案
我认为最好的办法是匹配您要查找的各个短语,并为每次匹配保存匹配开头的字符串偏移量。建立偏移量列表后,将偏移量从最低到最高排序。对于列表中的每个偏移量,通过添加字符串长度来计算字符串的结束偏移量。如果列表中任何后面的项目的偏移量小于此新偏移量,则将其删除。如果列表中的两个偏移量相同,则取两个字符串中较长的一个并丢弃另一个。
在您给出的示例中,“Twitter Analyzer”的偏移量为 4,“Twitter”的偏移量为 4 为了演示,假设您也对偏移量为 12 的“Analyzer”感兴趣。排序列表将是:
offset 4 - Twitter Analyzer - length 16
offset 4 - Twitter - length 7
offset 12 - Analyzer - length 8
因为有两个 4,扔掉长度较短的一个。然后将“twitter analyzer”的长度与其偏移量相加得到 20。任何小于 20 但大于 4 的偏移量都会被丢弃。
要插入字符串,请保留您的开始和结束偏移量列表并从列表末尾开始。在结束偏移处插入一个“”,在开始偏移处插入“
关于PHP 正则表达式挑战,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/4147673/