【问题标题】:Hide any URL contained in a given string except one隐藏给定字符串中包含的任何 URL,除了一个
【发布时间】:2014-07-16 09:37:39
【问题描述】:

我有一个带有小型聊天系统的预订网站,允许潜在客人向房东发送消息,例如询问是否有空房。

我希望隐藏用户键入的任何 URL(= 替换为 ****),除非它是我的站点域的 URL。 我目前有一个成功匹配任何 URL 的正则表达式:

    $replacing_string = '****';

    $userMessage = preg_replace('{\b(?:http://)?(www\.)?([^\s]+)(\.com|\.org|\.net|\.it)\b}mi', $replacing_string, $userMessage);

我需要对其进行编辑,以便匹配除包含 mydomain.com

的所有 URL

这些字符串的预期结果:

“嗨,请查看我的网站 www.othersite.com/room/123”

preg_replace 之后:

“嗨,请查看我的网站 ****”


“嗨,这个房间有空吗?www.mydomain.com/room/123”

preg_replace 之后:

“嗨,这个房间有空吗?www.mydomain.com/room/123”

【问题讨论】:

    标签: php regex validation preg-replace url-validation


    【解决方案1】:

    负预测

    我们可以通过对您现有的正则表达式进行最少的更改来做到这一点:

    $userMessage = preg_replace('(?!.*mydomain\.com){\b(?:http://)?(www\.)?([^\s]+)(\.com|\.org|\.net|\.it)\b}mi', $replacing_string, $userMessage);
    

    否定的前瞻(?!.*mydomain\.com) 断言接下来的不是一些字符然后mydomain.com

    参考

    【讨论】:

    • 是的,但是http://example.com/ad_bj_whores/mydomain.com ;-) 我建议不要构建复杂的类似 XOR 的正则表达式,而是在三个迭代中完成: 1. subst mydomain•com 带有一些 ★★★★★ ★★ UTF 废话,2. 屏蔽所有其他内容 3. 将 mydomain•com 转回来。
    • zx81 我认为您的正则表达式中有一个小的语法错误,但是将左大括号移到模式的开头,它可以完美运行!我还做了一个小的修改,以匹配非 .com 域,并隐藏域名后的 url 部分:{(?!.*mydomain)\b(?:http://)?(www\ .)?([^\s]+)(\.com|\.org|\.net|\.it)([^\s]+)\b}mi 谢谢你的提示! @mudasobwa 是的,我考虑过这个选项,但我正在寻找更清洁的解决方案。无论如何谢谢;)
    • 我注意到我在评论中发布的模式与域名后没有字符的 url 不匹配,所以 www.othersite.com/room/123 被隐藏但 www.othersite.com 没有.这是正确的模式:{(?!.*mydomain)\b(?:http://)?(www\.)?([^\s]+)(\.com|\.org|\.网络|\.it)([^\s]*)\b}‌​mi
    猜你喜欢
    • 2019-07-20
    • 2021-12-10
    • 1970-01-01
    • 2013-04-24
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多