首页 > 编程技术 > php

php中preg_replace和str_replace函数用法

发布时间:2016-11-25 14:58

今天我看到有朋友在问preg_replace和str_replace函数的区别在哪里,下面我就来给大家整理了一些关于这两个函数的使用技巧,希望文章来给你带来帮助哦。

str_replace可查找替换常规字符,
preg_replace可查找替换回车换行字符(\r\n)
preg_replace常用在

 代码如下 复制代码


<meta name="description" content="<?php echo htmlspecialchars(utf_substr(preg_replace('/\r\n/','',str_replace(' ','',strip_tags($this->getDescription()))),400)) ?>">

内容的过滤,过滤回车换行(\r\n)等

 代码如下 复制代码

<a href="/%E5%8A%A8%E4%BD%9C%E5%86%92%E9%99%A9_1.html1">首页</a> <a href="/%E5%8A%A8%E4%BD%9C%E5%86%92%E9%99%A9_1.html0" class="a1">上一页</a>

用str_replace函数和preg_replace函数替换成

 代码如下 复制代码

<a href="/%E5%8A%A8%E4%BD%9C%E5%86%92%E9%99%A9_1.html">首页</a> <a href="/%E5%8A%A8%E4%BD%9C%E5%86%92%E9%99%A9_1.html" class="a1">上一页</a>

例子

 代码如下 复制代码

$pages = $keyword_data_db->pages;
$pages = str_replace('?page=', '', $pages);
$pages = preg_replace('/_([0-9]+).html([0-9]+)/', '_$2.html', $pages);
$pages = str_replace('_0.html', '_1.html', $pages);

再看个比较例子

 代码如下 复制代码


$str =
'111111110000000000000000000000000000000111000001000100010000010010000010010000010100000010
';
$str = str_repeat($str, 1);
$pattern1 = array('12345'=>'', '67891'=>'');
$pattern2 = array('a'=>'', '1234567890'=>'');
$pattern3 = '/12345|67891/';
$pattern4 = '/a|1234567890/';
$pattern5 = array('12345', '67891');
$pattern6 = array('a', '1234567890'); 
$t = microtime(true);

echo microtime(true)-$t, "/n";        //0.4768660068512    2.7257590293884  
$t = microtime(true);
for($i=0; $i<10000; $i++)
{
     preg_replace($pattern3, '', $str);
}
echo microtime(true)-$t, "/n";        //0.30504012107849    1.0864448547363 
$t = microtime(true);
for($i=0; $i<10000; $i++)
{
     preg_replace($pattern4, '', $str);
}
echo microtime(true)-$t, "/n";        //0.30298089981079    1.117014169693  
$t = microtime(true);
for($i=0; $i<10000; $i++)
{
     str_replace($pattern5, '', $str);
}
echo microtime(true)-$t, "/n";        //0.18029189109802    0.22510504722595 
$t = microtime(true);
for($i=0; $i<10000; $i++)
{
     str_replace($pattern6, '', $str);
}
echo microtime(true)-$t, "/n";        //0.18104100227356   0.23055601119995 
//说明:当str_repeat的第二个参数为1时输出第一个数字,当为8时输出第二个数字

区别

区别就是str_replace被替换(查找)的内容是固定的、确定的,当然可以使用变量,但是变量也表示固定的、确定的内容,比如可以完成把所有的\n替换为<br>等场合。

而preg_replace被替换(查找)的内容是用规则来描述的,比如可以把所有的<和>之间的内容(HTML代码)替换掉。当然preg_replace也可以用来替换固定内容。

根据以上规则,所有str_replace能做的事情preg_replace都能办到,但是preg_replace的速度要慢些,使用也要复杂些,所以我们应该尽力使用str_replace。

下面整理了是一些在学习php mysql中我们一些常用的知识点,包括有分页,连接数据库及时登录与文件上会以的知识点,希望对各位有帮助。
 代码如下 复制代码

 

<?php
$con = mysql_connect("localhost","root","222222");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
  echo "成功"
 
//mysql_close($con); 关闭连接
//var_dump($row); 打印出来
//print_r(); 打印出来 没有上面功能强
-------------------------------------------
strlen("Hello world!"); //用于计算字符串的长度。
strpos("Hello world!","world"); //用于在字符串内检索一段字符串或一个字符。
 
 
-------------------------------------------
介绍数据库中常用字段类型
//整数型:TINYINT,SMALLINT,INT,BIGINT
 
//小数型:FLOAT,DOUBLE,DECIMAL(M,D)
 
//字符型:CHAR,VARCHAR
 
//日期型:DATETIME ,DATE,TIMESTAMP
 
//备注型:TINYTEXT ,TEXT ,LONGTEXT
 
//sql语句 大小写不敏感(系统的尽量大写)
 
CREATE TABLE `test` (   //需要把整理设置成utf8_general_ci
`id` int(10) NOT NULL auto_increment,
`uid` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL default '0',
`regdate` date NOT NULL,
`remark` text NULL,
PRIMARY KEY (`id`) //id为主键关键贞
)
//NOT NULL 不能为空 www.111cn.net
//auto_increment 自动累加
//varchar(10) default '0' 10个字符长度默认为0
-------------------------------------------
 
SELECT查询语句
//SELECT 查询字段 FROM 表名 WHERE 条件
 
查询字段 : 可以使用通配符 * ,字段名,字段别名
表名:数据库.表名,表名
常用条件 :=等于,<>不等于,in包含,not in 不包含,like匹配
BETWEEN在范围,not BETWEEN不在范围<,>
条件运算:and ,or ,()
 
//eg: SELECT id, uid FROM `test` WHERE 1;指定查询id uid
别名使用
//SELECT remark as r FROM `test` WHERE 1  别名使用 r 代替 remark
=等于
//SELECT * FROM `test` WHERE id=2; 查询id=2的
<>不等于
//SELECT * FROM `test` WHERE id<>2 查询id不等于2 的
in包含
//SELECT * FROM `test` WHERE id in(1,2,4);查询包含1,2,4的信息
not in 不包含
//SELECT * FROM `test` WHERE id not in (1,2,3);查询不包含1,2,3的信息
like匹配
//SELECT * FROM `test` WHERE `uid` like '%王%';  %是前后匹配,匹配到所有姓王的 `uid`是varchar 字符型要加上``
BETWEEN在范围
//SELECT * FROM `test` WHERE id BETWEEN 1 and 3 查询1-3这个范围内所有的信息
not BETWEEN不在范围
//SELECT * FROM `test` WHERE id not BETWEEN 1 and 3 查询不在1-3这个范的信息
多条件
//SELECT * FROM `test` WHERE id=2 and `uid`='吕辉' 多个条件查询,查询id=2并且uid=吕辉 的信息
---------------------------------------------------------
注:以下三个方法语句顺序不能乱; group by - order by - limit
分组语句:group by 字段(这里不需要条件语句)
//SELECT * FROM `test` group by `remark`
排序语句:order by 字段 ,字段ASC(正序)/DESC(倒序)
//SELECT * FROM `test` order by `regdate` DESC 倒序查询最新注册的
//SELECT * FROM `test` order by `regdate` DESC , id ASC 注册日期倒序,id正序查询
指针查询:limit 初始值,结束值(这里不需要条件语句)
//SELECT * FROM `test` limit 0,3 查询0到3条信息
//SELECT * FROM `test` limit 4 (等同上,省略掉0,初始值省略)
---------------------------------------------------------
计算:
COUNT(*)统计函数
MAX(*)最大值函数
MIN(*)最小值函数
AVG(*)平均值函数
SUM(*)累计值函数(∑)
 
//SELECT MIN(id) FROM `test` WHERE 1 查询最小值的Id
 
 
---------------------------------------------------------
 
insert插入语句
//insert into 表名(字段...,...)values(值..,...);规范的
//insert into 表名values(值..,..);不推荐使用
 
eg:
//insert into test (`id`,`uid`,`regdate`,`remark`) values('','张三',now(),'工人') id是auto++的可省略,now()系统现在时间
//insert into test values('','李四',now(),'学生') 同样可以插入,但不推荐使用
 
Update更新语句(不需要FROM)
//UPDATE 表名 SET 字段 = 值 WHERE 条件 limit(可省略)
eg:
//update test set uid='php200' where id=6 更新id=6的uid=php200
 
Delete 删除语句(删除是无法恢复的)
//DELETE FROM 表名 WHERE 条件 limit(可省略)
eg:
delete FROM test WHERE id=3 删除id=3 的信息 (尽量少使用,)
 
-------------------------------------------------------------
其他常用Mysql函数介绍
 
 mysql_num_rows() //用于计算查询结果中共多少条信息
//$sq = " SELECT * FROM messages order by id DESC "; //查找数据表并倒序
//$sque = mysql_query($sq);
//echo mysql_num_rows($sque);
 
mysql_insert_id //传回最后一次使用 INSERT 指令的 ID。
mysql_tablename //取得数据库名称
mysql_error   //返回错误信息
mysql_close //关闭 MySQL 链接
----------------------------------------------------------
isset($views) //判断变量是否存在
function_exists() //判断函数是否存在
 
两种查询函数array / row区别
//mysql_fetch_row(result);(不常用)
//mysql_fetch_array($sque,MYSQL_ASSOC);(常用)
//以上二种需配合while($row=mysql_fetch_array($sque,MYSQL_ASSOC)){}循环使用才能输出数据库全部内容;
 
延时跳转
header("Refresh:5;url=login.php");
----------------------------------------------------------
str_relace(被替换的值,替换的值,被替换的内容)
 
$lin='ss sd df';
//str_relace(" ","&nbsp;",$lin);替换空格
function htmtocode($con) {空格和换行替换成html标签
//  $con=str_replace("n","<br>",str_replace(" ","&nbsp;",$con));
//  return $con;
}
------------------------------------------------------------
 
htmlspecialchars格式化html
//主要功能是将html格式化,防止在输出html时被浏览器执行;
//htmlspecialchars(所要格式化对象,定义单双引号,编码)
------------------------------------------------------------
setcookie("TEST","value",3600,"/dir",".domains.com",true);
//TEST cookie名
//value cookie值
//3600 保存时间
//dir cookie保存路径
//.domains.com  起效域名
//true https 发送
//注意:使用php cookie当场不能生效,需要刷新一次
 
----------------------------------
PHP会话Session的具体使用方法解析
//PHP会话Session与Cookie的最大不同之处是,其实存储在服务器端的,对于远程用户来说,
//是无法对PHP会话Session文件的内容进行任何修改的。
开始 PHP Session
//详细 http://www.w3school.com.cn/php/php_sessions.asp
 
 session_start(); //1,启动必须在html标签前面
 $_SESSION['views']=1;//2,设置
 $_SESSION[''];//3,获取
 unset($_SESSION['views']);//4,删除
 session_destroy()//,彻底终结  将重置 session,您将失去所有已存储的 session 数据。
 
isset() //函数检测是否已设置 "views" 变量
//if(isset($_SESSION['views']))
file_exists("welcome.txt")  //检测文件是否存在
 
 
 
------------------------------------------------------------
PHP+MYSQL分页原理
 
1.SQL语句中的limit用法
分页原理
//所谓分页显示,也就是将数据库中的结果集,分成一段一段来显示
需要的条件
//前10条记录:select*form table limit 0,10
//第11至20条记录:select * from table limit 10,10
//第21至30条记录:select * from table limit 20,10
 
公式:
(当前页数-1)*每页条数,每页条数
// select * from table limit($Page-1)*$PageSize,$PageSize
----------------------------------------------------------
parse_url()
//是将URL解析成为固定键值名称的数组和函数
---------------------------------------------
$_SERVER["REQUEST_URI"];
//REQUEST_URL的作用是取得当前URL,也就是除域名外后面的完整的地址路径;
eg:
// http://www.php100.com/home.php?id=22&cid=21
//echo $SERVER["REQUEST_URI"]
//结果为:/home.php?id=22&cid=21
 
--------------------------------------------------------
PHP上传原理及应用
 
1、FORM标签enctype属性
2、$_FILES 系统函数
3、move_uploaded_file函数
4、is_uploaded_file 函数
 
 
 
---------------------------------------------------------
fopen() 函数用于在 PHP 中打开文件。
//fopen("welcome.txt","r");
 
//  模式  描述
//  r       只读。在文件的开头开始。
//  r+      读/写。在文件的开头开始。
//  w       只写。打开并清空文件的内容;如果文件不存在,则创建新文件。
//  w+      读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。
//  a       追加。打开并向文件文件的末端进行写操作,如果文件不存在,则创建新文件。
//  a+      读/追加。通过向文件末端写内容,来保持文件内容。
//  x       只写。创建新文件。如果文件已存在,则返回 FALSE。
//  x+ 
//  读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
//  注释:如果 fopen() 无法打开指定文件,则返回 0 (false)。
 
//如果 fopen() 不能打开指定的文件,下面的例子会生成一段消息:
//$file=fopen("welcome.txt","r") or exit("Unable to open file!");
 
fclose() 函数用于关闭打开的文件。
 
//$file = fopen("test.txt","r"); fclose($file);
 
feof() 函数检测是否已达到文件的末端 (EOF)。
在循环遍历未知长度的数据时,feof() 函数很有用。
//if (feof($file)) echo "End of file";
 
fgets() 函数用于从文件中逐行读取文件。
 
//  $file = fopen("welcome.txt", "r") or exit("Unable to open file!");
//  while(!feof($file))
//  {
//   echo fgets($file). "<br />";
//  }
//  fclose($file)
 
fgetc() 函数用于从文件逐字符地读取文件。
 
//  $file=fopen("welcome.txt","r") or exit("Unable to open file!");
    while (!feof($file))
//  {
//  echo fgetc($file);
//  }
//  fclose($file);
 
 
------------------------------------------------------
PHP 文件上传
//  <form action="upload_file.php" method="post" enctype="multipart/form-data">
//      <input type="file" name="file" id="file" />
//  </form>
 
$_FILES["file"]["name"] - 被上传文件的名称
$_FILES["file"]["type"] - 被上传文件的类型
$_FILES["file"]["size"] - 被上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] - 由文件上传导致的错误代码
 
eg:
 
if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "<br />";
  }
else
  {
  echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  echo "Type: " . $_FILES["file"]["type"] . "<br />";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  echo "Stored in: " . $_FILES["file"]["tmp_name"];
  }

星际的一些兵种会有不止一种状态,比如坦克可以架起来,机枪兵可以打兴奋剂,甚至还有一些被动的,比如被虫族女王喷洒绿色液体后,敌人的行动变慢。

如果按照一般的思路,每次我们对一个小兵进行操作的时候,比如一辆坦克,我们都要用if判断他的状态,这样代码中会有很多的if,else或者swith。


不过我们可以发现,我们需要的是他在某个状态下的行为,如果把这些行为按照状态封装起来,就可以减少大量的判断。


待解决的问题:封装坦克的状态,让状态自己去控制行为。


思路:把状态作为属性,兵种类本身只控制状态的变化,具体的行为由状态类定义。


状态(State)模式示例:

 代码如下 复制代码

<?php

//坦克状态的接口

interface TankState

{

  //坦克的攻击方法

  public function attack();

}

//坦克普通状态

class TankState_Tank implements TankState

{

  //坦克的攻击方法

  public function attack()

  {

  //这里简单的输出当前状态

  echo "普通状态";

  }

}

//坦克架起来的状态

class TankState_Siege implements TankState

{

  //坦克的攻击方法

  public function attack()

  {

  //这里简单的输出当前状态

  echo "架起来了";

  }

}

//坦克类

class Tank

{

  //状态

  public $state;

  //坦克的攻击方法

  public function __construct()

  {

  //新造出来的坦克当然是普通状态

  $this->state = new TankState_Tank();

  }

  //设置状态的方法,假设参数为玩家点击的键盘

  public function setState($key)

  {

   //如果按了s

    if($key = 's')

    {

      $this->state = new TankState_Siege();

    }

   //如果按了t

    elseif($key = 't')

    {

      $this->state = new TankState_Tank();

    }

  }

  //坦克的攻击方法

  public function attack()

  {

  //由当前状态自己来处理攻击

  $this->state->attack();

  }

}

//新造一辆坦克

$tank = new Tank();

//假设正好有个敌人路过,坦克就以普通模式攻击了

$tank->attack();

//架起坦克

$tank->setState('s');

//坦克再次攻击,这次是架起模式

$tank->attack();

?>

用途总结:状态模式可以将和状态相关的行为和属性封装,除了切换状态时,其它地方就不需要大量的判断当前状态,只要调用当前状态的方法等。


实现总结:用一个接口规范状态类需要实现的方法,比如上面的TankState规定了attack()。把各个状态封装成类,将不同状态下的不同方法放入各自的状态类,比如上面的攻击方法,同时所有的状态执行接口。原来的事务类,比如上面的Tank类,只负责状态切换,一旦需要某一个方法的调用,只要交给当前状态就可以了

在这里我们可以利用strtotime函数与date函数同时使用来获取了,例子非常的简单在此我就不介绍其它的了,直接上代码。

PHP获得今天凌晨时间戳,百度了一下,没看见有,也可能是我理解错了。

直接上代码:

比如,今天是2102年11月2号,那么php要获取2102年11月2号的时间戳是怎么办的呢?

代码:echo strtotime(date('Y-m-d')),'

';


获取明天凌晨的时间戳

代码:echo strtotime(date('Y-m-d',strtotime('+1 day'))),'

';

最后再附一串代码

<?php
echo "今天:".date("Y-m-d")."<br>";    
echo "昨天:".date("Y-m-d",strtotime("-1 day")), "<br>";    
echo "明天:".date("Y-m-d",strtotime("+1 day")). "<br>"; 
echo "一周后:".date("Y-m-d",strtotime("+1 week")). "<br>";    
echo "一周零两天四小时两秒后:".date("Y-m-d G:H:s",strtotime("+1 week 2 days 4 hours 2 seconds")). "<br>";    
echo "下个星期四:".date("Y-m-d",strtotime("next Thursday")). "<br>";    
echo "上个周一:".date("Y-m-d",strtotime("last Monday"))."<br>";    
echo "一个月前:".date("Y-m-d",strtotime("last month"))."<br>";    
echo "一个月后:".date("Y-m-d",strtotime("+1 month"))."<br>";    
echo "十年后:".date("Y-m-d",strtotime("+10 year"))."<br>";   
strtotime()函数的作用是将日期时间描述解析为 Unix 时间戳
int strtotime  ( string time [, int now] )
?>

做程序开发的朋友应该都听说过设计模式这个词,对于做java开发的,应该一听到这个词就明白是什么意思,但对于做PHP的朋友来说,往往越看越迷糊,那到底什么是设计模式呢?其实作者也不懂,下面是从网上摘抄的关于设计模式的一些解释,期待能够有一些理解。

 


php设计模式有如下

备忘录模式(Memento模式)

观察者模式(Observer模式)

模板方法模式(Template Method模式)

命令模式(command模式)

合成模式(composite模式)

享元模式(flyweight模式)

策略模式(strategy模式)

状态模式(state模式)

适配器模式(adapter模式)

工厂方法模式(factory method模式)

原型模式(prototype模式)

门面模式(facade模式)

单例模式(singleton模式)

桥梁模式(bridge模式)

装饰器模式(decorator模式)

抽象工厂模式(abstract factory模式)

建造者模式(Builder模式)

访问者模式(Visitor模式)


当你在不断的试图从你的应用程序中发现新的特征时,你是否发现你提出的解决方法和一些以前你已经实现的东西是如此的类似呢?如果你是一个程序员(即使你才开始很短的时间),你都可能回答“是”。这看起来就是你使用了一些以前的代码来解决软件开发过程中新发现的问题了。你可能已经认识到:你的解决方法是基本原理,是一个不仅仅是你而且是所有专业开发者都能广泛重复应用的方法。

事实上,许多程序问题都不断的反复的遇到,而且许多用来解决这些问题的基本方法(或者说是设计模式)都已经浮现出来。设计模式就是一个教你如何利用真实可靠的设计来组织你的代码的模板。

设计模式历史

“设计模式”这个术语最初被设计用于建筑学领域。Christopher Alexander 在他1977的著作“A Pattern Language:Towns/Building/Construction”里面描述了一些常见的建筑学设计问题,并解释了如何用这些已有的,著名的模式集合来开始全新的有效的设计。Alexander的观点被很好的转化到软件开发上来,并且长期的用原有的组件来构造新的解决方案。

所有的设计模式都有一些常用的特性:一个标识(a name),一个问题陈述(a problem statement)和一个解决方案(a solution)。

1、一个设计模式的标识是重要的,因为它会让其他的程序员不用进行太深入的学习就能立刻理解你的代码的目的(至少通过这个标识程序员会很熟悉这个模式)。

2、问题描述是用来说明这个模式的应用的领域。

3、解决方案描述了这个模型的执行。一个好的设计模式的论述应该覆盖使用这个模型的优点和缺点。

一个模式是解决特定问题的有效方法。一个设计模式不是一个库(能在你的项目中直接包含和使用的代码库)而是一个用来组织你的代码的模板。事实上,一个代码库和一个设计模式在应用上是有很多不同的。

比如,你从店铺里面买的一件衬衫是一个代码库,它的颜色,样式和大小都由设计师和厂商决定,但它满足了你的需求。然而,如果店里面没有什么衣服适合你,那你就能自己创建自己的衬衫(设计它的形状,选择布料,然后裁缝在一起)。但是如果你不是一个裁缝,你可能会发现自己很容易的去找一个合适的模式然后按着这个模式去设计自己的衬衫。使用一个模型,你可以在更少的时间内得到一个熟练设计的衬衫。

回到讨论软件上来,一个数据提取层或者一个CMS(content management system)就是一个库,它是先前设计好而且已经编码好了的,如果它能准确的满足你的需要那它就是一个好的选择。

 

工厂模式

工厂模式(Factory)允许你在代码执行时实例化对象。它之所以被称为工厂模式是因为它负责“生产”对象。工厂方法的参数是 你要生成的对象对应的类名称。

 代码如下 复制代码

Example #1 调用工厂方法(带参数)
<?php
class Example
{
    // The parameterized factory method
    public static function factory($type)
    {
        if (include_once 'Drivers/' . $type . '.php') {
            $classname = 'Driver_' . $type;
            return new $classname;
        } else {
            throw new Exception ('Driver not found');
        }
    }
}
?>

按上面的方式可以动态加载drivers。如果Example类是一个数据库抽象类,那么 可以这样来生成MySQL和 SQLite驱动对象:
<?php
// Load a MySQL Driver
$mysql = Example::factory('MySQL');

// Load a SQLite Driver
$sqlite = Example::factory('SQLite');
?>
单例

单例模式(Singleton)用于为一个类生成一个唯一的对象。最常用的地方是数据库连接。 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。

Example #2 单例模式
<?php
class Example
{
    // 保存类实例在此属性中
    private static $instance;
   
       // 构造方法声明为private,防止直接创建对象
    private function __construct()
    {
        echo 'I am constructed';
    }

    // singleton 方法
    public static function singleton()
    {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }

        return self::$instance;
    }
   
    // Example类中的普通方法
    public function bark()
    {
        echo 'Woof!';
    }

    // 阻止用户复制对象实例
    public function __clone()
    {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }

}

?>

这样我们可以得到一个独一无二的Example类的对象。
<?php

// 这个写法会出错,因为构造方法被声明为private
$test = new Example;

// 下面将得到Example类的单例对象
$test = Example::singleton();
$test->bark();

// 复制对象将导致一个E_USER_ERROR.
$test_clone = clone $test;

?>

最后一个想法:就象一个裁缝模型,一个设计本身而言是没有什么用处的。毕竟,你不可能穿一个服装模型,它仅仅是由很薄的纸拼凑起来的。类似的,一个软件设计模型也仅仅只是一个引导。它必须根据程序设计语言和你的应用程序的特点和要求而特别的设计。

标签:[!--infotagslink--]

您可能感兴趣的文章: