php获取当前url地址的方法介绍

 更新时间:2017年1月22日 11:07  点击:2490
这篇文章介绍了php获取当前url地址的方法小结,有兴趣的同学可以参考一下

本文实例讲述了php获取当前url地址的方法。分享给大家供大家参考,具体如下:

js 获取:

top.location.href //顶级窗口的地址

this.location.href//当前窗口的地址

php获取当前url地址:

#测试网址:   http://localhost/blog/testurl.php?id=5

//获取域名或主机地址

echo$_SERVER['HTTP_HOST']."
"; #localhost

//获取网页地址

echo$_SERVER['PHP_SELF']."
"; #/blog/testurl.php

//获取网址参数

echo$_SERVER["QUERY_STRING"]."
"; #id=5

//获取用户代理

echo$_SERVER['HTTP_REFERER']."
";

//获取完整的url

echo'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

echo'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];

#http://localhost/blog/testurl.php?id=5

//包含端口号的完整url

echo'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];

#http://localhost:80/blog/testurl.php?id=5

//只取路径

$url='http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"];

echodirname($url);

#http://localhost/blog

小编推荐的这篇文章介绍了PHP验证码类ValidateCode的解析,有需要的同学可以参考一下

PHP解析验证码类

1.开始

在网上看到使用PHP写的ValidateCode生成验证码类,感觉不错,特拿来分析学习一下。

2.类图

 

3.验证码类部分代码

3.1  定义变量

1
2
3
4
5
6
7
8
9
10
11
//随机因子
private$charset='abcdefghjkmnprstuvwxyzABCDEFGJKMNPRSTUVWXYZ23456789';
private$code;
private$codeLen= 4;
 
private$width= 130;
private$heigh= 50;
private$img;//图像
 
private$font;//字体
private$fontsize= 20;

$charset 是随机因子,这里是去掉了几个不容易区分的字符,如字母"i,l,o,q",数字"0,1"。有必要可以加入一些中文或其他字符或算式等。

$codeLen表示验证码长度,常见4位。

3.2构造函数,设置验证码字体,生成一个真彩色图像img

1
2
3
4
5
publicfunction__construct()
  {
    $this->font = ROOT_PATH.'/font/Chowderhead.ttf';
    $this->img = imagecreatetruecolor($this->width,$this->heigh);
  }

3.3从随机因子中随机抽取4个字符,作为$code验证码.

1
2
3
4
5
6
7
8
//生成随机码
  privatefunctioncreateCode()
  {
    $_len=strlen($this->charset) - 1;
    for($i= 0;$i<$this->codeLen;$i++) {
      $this->code .=$this->charset[mt_rand(0,$_len)];
    }
  }

3.4生成验证码背景色.

1
2
3
4
5
6
7
//生成背景
  privatefunctioncreateBg()
  {
$color= imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
    imagefilledrectangle($this->img, 0,$this->heigh,$this->width, 0,$color);
 
  }

其中mt_rand(157, 255),目的是随机取比较浅的颜色。

3.5在图像上生成文字.

1
2
3
4
5
6
7
8
9
10
//生成文字
  privatefunctioncreateFont()
  {
    $_x=$this->width /$this->codeLen;
    $_y=$this->heigh / 2;
    for($i= 0;$i<$this->codeLen;$i++) {
      $color= imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
      imagettftext($this->img,$this->fontsize, mt_rand(-30, 30),$_x*$i+ mt_rand(3, 5),$_y+ mt_rand(2, 4),$color,$this->font,$this->code[$i]);
    }
  }

在图像上生成验证码文字,主要考虑文字在图像上的位置和每一个文字颜色。

控制第n个文字的x轴位置 =  (图像宽度 / 验证码长度) * (n-1)  +  随机的偏移数;  其中n = {d1....n}

控制第n个文字的y轴位置 =  图像高度 / 2 +  随机的偏移数;

mt_rand(0, 156) 随机取文字颜色,0-156目的是取比较深的颜色。

mt_rand(-30, 30) 随机的文字旋转。

3.6在图像上生成线条和雪花

1
2
3
4
5
6
7
8
9
10
11
12
//生成线条,雪花
  privatefunctioncreateLine()
  {
    for($i= 0;$i< 15;$i++) {
      $color= imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
      imageline($this->img, mt_rand(0,$this->width), mt_rand(0,$this->heigh), mt_rand(0,$this->width), mt_rand(0,$this->heigh),$color);
    }
    for($i= 0;$i< 150;$i++) {
      $color= imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
      imagestring($this->img, mt_rand(1, 5), mt_rand(0,$this->width), mt_rand(0,$this->heigh),'#',$color);
    }
  }

画线条的时候,取比较深的颜色值,而画雪花的时候取比较淡的颜色值,目的是尽可能的不影响人眼识别验证码,又能干扰自动识别验证码机制。

3.7对外生成验证码图像,供外部调用。

1
2
3
4
5
6
7
8
9
10
//对外生成
  publicfunctiondoImg()
  {
 
    $this->createBg();  //1.创建验证码背景
    $this->createCode(); //2.生成随机码
    $this->createLine(); //3.生成线条和雪花
    $this->createFont(); //4.生成文字
    $this->outPut();   //5.输出验证码图像
  }

3.8完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
 
/**
 * Created by PhpStorm.
 * User: andy
 * Date: 16-12-22
 * Time: 下午1:20
 */
classValidateCode
{
  //随机因子
  private$charset='abcdefghjkmnprstuvwxyzABCDEFGJKMNPRSTUVWXYZ23456789';
  private$code;
  private$codeLen= 4;
 
  private$width= 130;
  private$heigh= 50;
  private$img;//图像
 
  private$font;//字体
  private$fontsize= 20;
 
 
  publicfunction__construct()
  {
    $this->font = ROOT_PATH.'/font/Chowderhead.ttf';
    $this->img = imagecreatetruecolor($this->width,$this->heigh);
  }
 
  //生成随机码
  privatefunctioncreateCode()
  {
    $_len=strlen($this->charset) - 1;
    for($i= 0;$i<$this->codeLen;$i++) {
      $this->code .=$this->charset[mt_rand(0,$_len)];
    }
  }
 
  //生成背景
  privatefunctioncreateBg()
  {
 
    $color= imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
    imagefilledrectangle($this->img, 0,$this->heigh,$this->width, 0,$color);
 
  }
 
  //生成文字
  privatefunctioncreateFont()
  {
    $_x=$this->width /$this->codeLen;
    $_y=$this->heigh / 2;
    for($i= 0;$i<$this->codeLen;$i++) {
      $color= imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
      imagettftext($this->img,$this->fontsize, mt_rand(-30, 30),$_x*$i+ mt_rand(3, 5),$_y+ mt_rand(2, 4),$color,$this->font,$this->code[$i]);
    }
  }
 
  //生成线条,雪花
  privatefunctioncreateLine()
  {
    for($i= 0;$i< 15;$i++) {
      $color= imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
      imageline($this->img, mt_rand(0,$this->width), mt_rand(0,$this->heigh), mt_rand(0,$this->width), mt_rand(0,$this->heigh),$color);
    }
    for($i= 0;$i< 150;$i++) {
      $color= imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
      imagestring($this->img, mt_rand(1, 5), mt_rand(0,$this->width), mt_rand(0,$this->heigh),'#',$color);
    }
  }
 
  //输出图像
  privatefunctionoutPut()
  {
    header('Content-Type: image/png');
    imagepng($this->img);
    imagedestroy($this->img);
  }
 
  //对外生成
  publicfunctiondoImg()
  {
 
    $this->createBg();  //1.创建验证码背景
    $this->createCode(); //2.生成随机码
    $this->createLine(); //3.生成线条和雪花
    $this->createFont(); //4.生成文字
    $this->outPut();   //5.输出验证码图像
  }
 
  //获取验证码
  publicfunctiongetCode()
  {
    returnstrtolower($this->code);
  }
 
}

4.测试

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
/**
 * Created by PhpStorm.
 * User: andy
 * Date: 16-12-22
 * Time: 下午1:20
 */
 
define('ROOT_PATH', dirname(__FILE__));
require_onceROOT_PATH.'/includes/ValidateCode.class.php';
 
$_vc=newValidateCode();
echo$_vc->doImg();

生成验证码:

5.应用 

1
2
3
<label>
<imgsrc="../config/code.php"onclick="javascript:this.src='../config/code.php?tm='+Math.random();"/>
</label>

上面onclick代码是点击验证码图片,能自动刷新验证码。

code.php:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
/**
 * Created by PhpStorm.
 * User: andy
 * Date: 16-12-22
 * Time: 下午3:43
 */
requiresubstr(dirname(__FILE__),0,-7).'/init.inc.php';
 
$_vc=newValidateCode();
echo$_vc->doImg();
$_SESSION['ValidateCode']=$_vc->getCode();

有关应用的完整代码可以从https://git.oschina.net/andywww/myTest 的CMS1.0 文件里下载。

6.小结

在独立测试过程,没发现什么问题;但应用到项目的时候,刚开始发现无法生成验证码图片,网上找了一下,有的说是在outPut()函数中,

在header('Content-Type: image/png'); 这行代码前面增加了一行ob_clean()代码,可以解决验证码这块问题。虽然此方法简单,但这可能会引起其他缓冲数据问题,因为db_clean()功能就是丢弃输出缓冲区中的内容。

这篇文章介绍了PHP正则表达式效率 贪婪、非贪婪与回溯分析,有需要的同学可以参考一下

先扫盲一下什么是正则表达式的贪婪,什么是非贪婪?或者说什么是匹配优先量词,什么是忽略优先量词?

好吧,我也不知道概念是什么,来举个例子吧。

某同学想过滤之间的内容,那是这么写正则以及程序的。

$str= preg_replace('%<script>.+?</script>%i','',$str);//非贪婪

看起来,好像没什么问题,其实则不然。若

$str='<script<script>alert(document.cookie)</script>>alert(document.cookie)</script>';

那么经过上面的程序处理,其结果为

$str='<script<script>alert(document.cookie)</script>>alert(document.cookie)</script>';
$str= preg_replace('%<script>.+?</script>%i','',$str);//非贪婪
print_r($str);
//$str 输出为 <script>alert(document.cookie)</script>

仍然达不到他想要的效果。上面的就是非贪婪,也有的叫惰性。其标志非贪婪的标识为量数元字符后面加? ,比如 +?、*?、??(比较特殊,以后的BLOG中,我会写到)等。即标识非贪婪,如果不写?就是贪婪。比如

$str='<script<script>alert(document.cookie)</script>>alert(document.cookie)</script>';
$str= preg_replace('%<script>.+</script>%i','',$str);//非贪婪
print_r($str);
//$str 输出为 <script 只有这些了,好像还是不太合适,哈,您知道如何重写那个正则吗?

以上为贪婪,非贪婪的区别介绍。下面,聊下贪婪、非贪婪引起的回溯问题。先看个小例子。

正则表达式为\w*(\d+),字符串为cfc456n,那么,这个正则匹配的$1是多少??

如果您回答是 456,那么,恭喜你,回答错了,其结果不是456,而是6,您知道为什么吗?

CFC4N来解释一下,当正则引擎用正则\w*(\d+)去匹配字符串cfc456n时,会先用\w*去匹配字符串cfc456n,首先,\w*会匹配字符串cfc456n的所有字符,然后再交给\d+去匹配剩下的字符串,而剩下的没了,这时,\w*规则会不情愿的吐出一个字符,给\d+去匹配,同时,在吐出字符之前,记录一个点,这个点,就是用于回溯的点,然后\d+去匹配n,发现并不能匹配成功,会再次要求\w*再吐出一个字符,\w*会先再次记录一个回溯的点,再吐出一个字符。这时,\w* 匹配的结果只有cfc45了,已经吐出6n了,\d+再去匹配6,发现匹配成功,则会通知引擎,匹配成功了,就直接显示出来了。所以,(\d+)的结果是6,而不是456。

当上面的正则表达式改为 \w*?(\d+)(注意,此处为非贪婪),字符串仍然为cfc456n,那么,这时候,正则匹配的$1是多少??

甲同学回答:结果是 456。

嗯,是的,正确,是456,CFC4N弱弱的问下,为什么是456 呢?

我在来解释一下 为什么是456

正则表达式有条规则,是量词优先匹配,所以\w*?会先去匹配字符串cfc456,由于\w*?是非贪婪,正则引擎会用表达式\w+?每次仅匹配一个字符串,然后再将控制权交给后面的\d+去匹配下一个字符,同时,记录一个点,用于在匹配不成功的时候,返回这里,再次匹配,也就是回溯点。由于\w后面是量词是*,*表示0到无数次,所以,首先是0次,也就是\w*?匹配个空,记录回溯点,将控制权交给\d+,\d+去匹配cfc456n的第一个字符c,然后,匹配失败,于是乎,接着讲控制权交给\w*?去匹配cfc456n的c,\w*?匹配c成功,由于是非贪婪,所以,他每次只匹配一个字符,记录回溯点,然后再将控制权交给\d+匹配f,接着,\d+匹配f再失败,再把控制权给\w*?,\w*?再匹配c,记录回溯点(这时\w*?匹配结果是cfc了),再把控制权给\d+,\d+去匹配4,匹配成功,然后,由于量词是+,就是1到无数次,所以,接着往后匹配,再匹配5,成功,再接着,再匹配6,成功,再接着,继续匹配操作,下一个字符是n,匹配失败,这时,\d+会吧控制权交出去。由于\d+后面已经没有正则表达式了,所以,整个正则表达式宣告匹配完成,其结果就是 cfc456, 其中第一组结果是456。亲爱的同学,您明白刚刚的题目的结果,为什么是456了吗?

好了,您是否从上面的例子了解了贪婪,非贪婪的匹配原理了?那您是否明白您在什么时候需要使用贪婪,非贪婪去处理您的字符串了?

鸟哥的文章里讲到针对表达式、程序为

$reg="/<script>.*?<\/script>/is";
$str="<script>********</script>";//长度大于100014
$ret= preg_repalce($reg,"",$str);//返回NULL

其原因就是回溯太多了,直到造成耗尽栈空间爆栈。

再来看个例子。

字符串

$str='<script>123456</script>';

正则表达式为

$strRegex1='%<script>.+<\/script>%';
$strRegex2='%<script>.+?<\/script>%';
$strRegex3='%<script>(?:(?!<\/script>).)+<\/script>%';
小编给大家推荐的这篇文章介绍了python捕获shell/bash脚本的输出结果实例,有需要的同学可以参考一下

#!/usr/bin/python
## get subprocess module
import subprocess
 
## call date command ##
p = subprocess.Popen("date", stdout=subprocess.PIPE, shell=True)
 
## Talk with date command i.e. read data from stdout and stderr. Store this info in tuple
## Interact with process: Send data to stdin. Read data from stdout and stderr,
## until end-of-file is reached.Wait for process to terminate. The optional input
## argument should be a string to be sent to the child process, or None,
## if no data should be sent to the child. ##
(output, err) = p.communicate()
 
## Wait for date to terminate. Get return returncode ##
p_status = p.wait()
print "Command output : ", output
print "Command exit status/return code : ", p_status
 
## from: http://www.cyberciti.biz/faq/python-run-external-command-and-get-output/

[!--infotagslink--]

相关文章

  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • php 获取用户IP与IE信息程序

    php 获取用户IP与IE信息程序 function onlineip() { global $_SERVER; if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('HTTP_CLIENT_IP');...2016-11-25
  • php获取一个文件夹的mtime的程序

    php获取一个文件夹的mtime的程序了,这个就是时间问题了,对于这个问题我们来看小编整理的几个例子,具体的操作例子如下所示。 php很容易获取到一个文件夹的mtime,可以...2016-11-25
  • 如何获取网站icon有哪些可行的方法

    获取网站icon,常用最简单的方法就是通过website/favicon.ico来获取,不过由于很多网站都是在页面里面设置favicon,所以此方法很多情况都不可用。 更好的办法是通过google提供的服务来实现:http://www.google.com/s2/favi...2014-06-07
  • jquery如何获取元素的滚动条高度等实现代码

    主要功能:获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 :$(window).width(); 获取页面的文档高度 $(document).height(); 获取页面的文档宽度 :$(document).width();...2015-10-21
  • jquery获取div距离窗口和父级dv的距离示例

    jquery中jquery.offset().top / left用于获取div距离窗口的距离,jquery.position().top / left 用于获取距离父级div的距离(必须是绝对定位的div)。 (1)先介绍jquery.offset().top / left css: 复制代码 代码如下: *{ mar...2013-10-13
  • Jquery 获取指定标签的对象及属性的设置与移除

    1、先讲讲JQuery的概念,JQuery首先是由一个 America 的叫什么 John Resig的人创建的,后来又很多的JS高手也加入了这个团队。其实 JQuery是一个JavaScript的类库,这个类库集合了很多功能方法,利用类库你可以用简单的一些代...2014-05-31
  • C#获取字符串后几位数的方法

    这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • DOM XPATH获取img src值的query

    复制代码 代码如下:$nodes = @$xpath->query("//*[@id='main_pr']/img/@src");$prurl = $nodes->item(0)->nodeValue;...2013-10-04
  • jquery获取tagName再进行判断

    如果是为了取到tagName后再进行判断,那直接用下面的代码会更方便: $(element).is('input') 如果是要取到标签用作到别的地方,可以使用一下代码: $(element)[0].tagName 或: $(element).get(0).tagName...2014-05-31
  • PHP 如何获取二维数组中某个key的集合

    本文为代码分享,也是在工作中看到一些“大牛”的代码,做做分享。 具体是这样的,如下一个二维数组,是从库中读取出来的。 代码清单: 复制代码 代码如下: $user = array( 0 => array( 'id' => 1, 'name' => '张三', 'ema...2014-06-07
  • 浅析Promise的介绍及基本用法

    Promise是异步编程的一种解决方案,在ES6中Promise被列为了正式规范,统一了用法,原生提供了Promise对象。接下来通过本文给大家介绍Promise的介绍及基本用法,感兴趣的朋友一起看看吧...2021-10-21
  • php获取汉字拼音首字母的方法

    现实中我们经常看到这样的说明,排名不分先后,按姓名首字母进行排序。这是中国人大多数使用的排序方法。那么在php程序中该如何操作呢?下面就分享一下在php程序中获取汉字拼音的首字母的方法,在网上搜到的大多数是有问题的...2015-10-23
  • 使用C#获取系统特殊文件夹路径的解决方法

    本篇文章是对使用C#获取系统特殊文件夹路径的解决方法进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • php如何获取文件的扩展名

    网上也有很多类似的方法,不过都存在这样那样的不严谨的问题,本文就不一一分析了,这里只给出最正确的利用php 获取文件扩展名(文件后缀名)的方法。 function get_extension($filename){ return pathinfo($filename,PATHIN...2015-10-30
  • 基于JavaScript获取鼠标位置的各种方法

    这篇文章主要介绍了基于JavaScript获取鼠标位置的各种方法 ,需要的朋友可以参考下...2015-12-18
  • C#获取变更过的DataTable记录的实现方法

    这篇文章主要介绍了C#获取变更过的DataTable记录的实现方法,对初学者很有学习借鉴价值,需要的朋友可以参考下...2020-06-25
  • 如何获取百度搜索结果页中解密之后的真实链接

    大家用百度搜索的时候,可能会发现,结果链接用的还是百度的链接,点击之后才会跳转到另外一个页面,另外一个页面的真实链接如何获取到呢?? 通过分析发现: 可以看出,返回...2016-05-19
  • 用python获取txt文件中关键字的数量

    这篇文章主要介绍了如何用python获取txt文件中关键字的数量,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下...2020-12-24
  • C#设置与获取环境变量的方法详解

    这篇文章主要给大家介绍了关于C#设置与获取环境变量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。...2020-06-25