【问题标题】:PHP - remove words (http|https|www|.com|.net) from string that do not start with specific wordsPHP - 从不以特定单词开头的字符串中删除单词(http|https|www|.com|.net)
【发布时间】:2015-04-27 01:45:54
【问题描述】:

我有一个字符串,其中包含一些文本和一些 URL。我的目标是从字符串中删除以下内容:

$removeThis = array('http://', 'https://', 'www.', '.com', '.net');

但仅当要删除的单词不以开头:http://good.comhttp://www.good.comhttps://good.com、或https://www.good.com

换句话说,我想从字符串中删除 http|s|www.|.com|.net 部分(但前提是它们不属于 good.com 域)。


输入:

$string='Hello world, this is spamming: www.spam.com, spam.net, https://spam.com, https://spam.com/tester. And this is not spam so do not touch it: http://www.good.com/okay, http://good.com, and also https://good.com/well';

结果应该是:

Hello world, this is spamming: spam, spam, spam, spam/tester. And this is not spam so do not touch it: http://www.good.com/okay, http://good.com, and also https://good.com/well

我认为这里需要 preg_replace..

【问题讨论】:

  • 是的,你可以在这里使用 preg_replace。你在哪里被它挂断了?
  • 我不明白 preg_replace 是如何工作的。我试过:str_replace (array('http','https','www.','',$string),但它会删除所有内容。但我想留下包含 good.com 域的网址..
  • 是的,您的 str_replace 会删除所有内容。你已经知道你需要使用 preg_replace,那么为什么不直接研究它,而不是浪费别人的时间来给你答案呢?如果您在 preg_replace 中遇到某些问题,那么请使用您迄今为止尝试过的代码提出与它相关的问题。 php 的美妙之处在于,大部分您的问题都可以通过阅读和谷歌搜索来回答。
  • 我只是无法理解正则表达式,我认为 preg_replace 使用正则表达式。是的,我研究过它,但对我来说很难掌握..
  • 附带说明,您可以调用explode() 将字符串拆分为一个tmp 数组,而不是preg_replace。从那里,我将创建两个新数组 goodbad,..while 在 foreach 循环中,将好域和坏域分隔到它们自己的数组中(查看 strpos())。在坏域数组上执行str_replace,然后将两个数组重新合并在一起,如果你愿意,implode() 将它们重新组合成一个字符串

标签: php


【解决方案1】:

试试下面:

  $preg = '/(?:(http|https):\/\/)?(?:www\.)?\w+\.(com|net)/i';

$str = preg_replace_callback($preg, function($matches) {
    $removeThis = array('/http:\/\//i', 'https://', 'www.', '.com', '.net');
    if (preg_match('/(http|https):\/\/(www\.)?good\.(com|net)/i', $matches[0])) return $matches[0];
    return preg_replace('/((http|https):\/\/|www\.|\.com|\.net)/i', '', $matches[0]);
}, $string);

【讨论】:

  • 更改 '/\bgood\b\.(com|net)/' 使用 '/(http|https):\/\/(www\.)?good\.(com|net )/' 找到好的url而不是替换它更准确
  • 并更改 $preg 使用 $preg = '/(?:(http|https):\/\/)?(?:www\.)?\w+\.(com|net) /';希望对你有帮助!
  • 对不起!我没注意看
  • 还有一个 - 如果用户输入:WWW.TEST.coM (即大写字母 - 似乎当前代码无法解决它,也许您可​​以再次更新它以便它与两者一起使用大小写..)
【解决方案2】:

你应该使用非常强大的正则表达式,这里的步骤很容易做到:

  1. 使用 preg_replace_callback 匹配所有 url
  2. 在回调函数中,检测是否属于白名单域(preg_match 或 strrpos)
  3. 仍在回调函数中:处理字符串并返回它

网址的正则表达式:

#^(https?|ftp):\/\/(-\.)?([^\s\/?\.#]+\.?)+(\/[^\s]*)?$#

【讨论】:

    【解决方案3】:

    这可能会对您有所帮助:

    $url = "www.good.net/tooooo.php";
    $regex = array('/(https?:..)/','/^www\./','/(\.com.|\.net.|\.co.)+([^\s]+)/');
    $url = preg_replace($regex, '', $url);
    echo $url;
    

    【讨论】:

      猜你喜欢
      • 2018-12-22
      • 2020-12-12
      • 2014-02-26
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多