微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP正则表达式挑战

我对正则表达式的体验不仅仅是介绍,所以这是一个挑战.也许一些数学/物理/有人可以搞清楚……

我们必须用< span class =“tooltip”>< / span>来包装某些单词/短语这样就可以显示跨度内容的相关工具提示.挑战在于如果它是已经包装的另一个短语的一部分,如何避免不包装两次单词.

示例:“使用Twitter Analyzer进行分析”.

Twitter和Twitter Analyzer都有工具提示,但只有Twitter Analyzer需要包含在上面.这是通过确保我们首先搜索最长的短语来实现的.

如果它已经包裹在另一个跨度中,你如何阻止(仅使用正则表达式)两个短短语再次被包裹?

此外,Twitter和Twitter Analytics只是整个列表的两个示例,因此它必须是通用的.

有任何想法吗?

解决方法:

我认为你最好的选择是匹配你正在寻找的单个短语,并且对于每次击中,保存比赛开始时的字符串偏移量.构建偏移列表后,将偏移从最低到最高排序.对于列表中的每个偏移量,通过添加字符串长度来计算字符串的结束偏移量.如果列表中的任何后续项目的偏移量小于此新偏移量,请将其删除.如果列表中的两个偏移量相同,则取两个字符串中较长的一个并将另一个字符串抛出.

在您给出的示例中,“Twitter Analyzer”的偏移量为4,“Twitter”的偏移量为4.为了演示,假设您还对“Analyzer”感兴趣,其偏移量为12.排序列表为:

offset 4 - Twitter Analyzer - length 16
offset 4 - Twitter          - length 7
offset 12 - Analyzer        - length 8

因为有两个4,所以抛出一个长度较短的一个.然后将“twitter analyzer”的长度添加到其偏移量中以获得20.任何小于20但大于4的偏移都会被抛出.

要插入字符串,请保留开始和结束偏移列表,并从列表末尾开始.在结束偏移处插入“< / span>”并且在开始偏移处插入“< span class =”tooltip>“在字符串中向后移动直到到达前面.这将允许您进行替换而无需重新计算偏移.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐