【问题标题】:Cleaning URL in php在 php 中清理 URL
【发布时间】:2014-07-15 15:09:23
【问题描述】:

我有一组 URL,我需要将它们导入数据库,但这些 URL 中传递了一些变量(Google 跟踪代码),我正在尝试自动清理。

网址示例:http://canadaam.ctvnews.ca/health/online-test-for-alzheimer-s-measuring-your-cognitive-health-1.1914180&ct=ga&cd=CAIyAA&usg=AFQjCNFZKDiQeiP0vhyBKcqssn9Zz8Lhqg

如您所见,我需要清除这里的任何内容

"&ct=ga&cd=CAIyAA&usg=AFQjCNFZKDiQeiP0vhyBKcqssn9Zz8Lhqg"

我确实知道我可以使用 str_replace 清除它,但这仅在 url 中的所有代码都相似并且我们都知道每个 URL 可以有自己的代码时才有效,因此我正在寻找解决方案或任何关于如何操作的指导解决这个问题。

任何帮助将不胜感激。

【问题讨论】:

  • 那个网址在我看来不正确..
  • 是的,它缺少?。错字?
  • 它是来自 Google Feed 的副本
  • 感谢您指出 Google Feed,我在我们的日志中发现了相同的 404 类型的 url,我想知道是否缺少 \?性格是由于我们的错误或错误的要求。如果您有任何信息,请分享更多信息。同时我建议你通过 htaccess 重写(如果你使用 Apache)

标签: php url


【解决方案1】:

只要您不关心任何 URL 参数,您就可以使用explode

例如这样的事情应该可以工作:

$url = "http://canadaam.ctvnews.ca/health/online-test-for-alzheimer-s-measuring-your-cognitive-health-?1.1914180&ct=ga&cd=CAIyAA&usg=AFQjCNFZKDiQeiP0vhyBKcqssn9Zz8Lhqg";

$urlArray = explode("?", $url);

echo $urlArray[0];

【讨论】:

  • 我刚刚添加了一个?在上面的例子中,使用 & 或任何其他你确定不会在你想要的部分结束之前出现的字符就可以了。
  • 谢谢,好的,我想到了这个,但是如果我检查 CT 是否存在然后清除值,因为大多数 URL 上都存在 GA、CT、USG
  • Dean,感谢您的更新,但是如果 URL 中已经有 & 并由 Google 代码跟随怎么办?
  • 如果所有 URL 都添加了完全相同的 Google 参数(ct、cd、usg)并且顺序相同,那么您可以使用带有“&ct=ga”分隔符的explode()您的原始 URL + 附带的任何参数。唯一的问题是 Google 添加的参数是否更改。如果他们这样做并且只有一些变化,那么您仍然可以使用这种方法,但您必须首先添加一个步骤来检查字符串的格式以及应该使用哪个分隔符。跨度>
  • 在这种情况下,您还可以使用 strpos() 和 substr() 的组合,这实际上可能比 explode 更好,因为您只需要字符串的第一部分。
【解决方案2】:

试试下面的

$url = 'http://canadaam.ctvnews.ca/health/online-test-for-alzheimer-s-measuring-your-cognitive-health-1.1914180?ct=ga&cd=CAIyAA&usg=AFQjCNFZKDiQeiP0vhyBKcqssn9Zz8Lhqg';

$parts = parse_url($url);
unset($parts['query']);
echo unparse_url($parts);


function unparse_url($parts_arr) {
   if (strcmp($parts_arr['scheme'], '') != 0) {
     $ret_url = $parts_arr['scheme'] . '://';
   }
   $ret_url .= $parts_arr['user'];
   if (strcmp($parts_arr['pass'], '') != 0) {
     $ret_url .= ':' . $parts_arr['pass'];
   }
   if ((strcmp($parts_arr['user'], '') != 0) || (strcmp($parts_arr['pass'], '') != 0)) {
     $ret_url .= '@';
   }
   $ret_url .= $parts_arr['host'];
   if (strcmp($parts_arr['port'], '') != 0) {
     $ret_url .= ':' . $parts_arr['port'];
   }
   $ret_url .= $parts_arr['path'];
   if (strcmp($parts_arr['query'], '') != 0) {
         $ret_url .= '?' . $parts_arr['query'];
       }
       if (strcmp($parts_arr['fragment'], '') != 0) {
         $ret_url .= '#' . $parts_arr['fragment'];
     }

   return $ret_url;
 }

http://saatske.demon.nl/vanWWW/php/function.parse-url.php找到的函数

【讨论】:

  • 谢谢,我可以看到您的解决方案,但除了原始 URL 外,它不返回任何内容
  • 您的问题中的网址不正确 - 您需要将第一个 & 替换为 ?尝试浏览两个版本(您的和我的),您会看到一个有效,另一个无效!
  • 确实,但我的意思是,这是来自 Google Feed 的代码,这是第三方网站,我的代码中没有生成 & 或 /&,这是我从 Google Alerts 获得的 URL - 有什么解决方案吗?
  • 检查 ?在网址中。如果不存在,则将第一次出现的 & 替换为 ?
猜你喜欢
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多