php使用preg_replace实现正则表达式的搜索结果和替换对应数组键值

1668 2016-11-25 17:42

文章来给大家详细介绍php使用preg_replace实现正则表达式的搜索结果和替换对应数组键值实现有需要了解的同学可参考。

1、preg_replace的用途及使用方法

用途:执行正则表达式的搜索和替换;

正则替换

preg_replace() 函数用于正则表达式的搜索和替换。

语法:

mixed preg_replace( mixed pattern, mixed replacement, mixed subject [, int limit ] )

1. 逆向引用后面紧接着数字的用法

 代码如下 复制代码

<?php
$string = "April 15, 2003";
$pattern = "/(/w+) (/d+), (/d+)/i";
$replacement = "/${1}1,/$3";
print preg_replace($pattern, $replacement, $string);

/* Output
   ======

April1,2003

*/
?>


2、匹配及替换数组对应键值的方法

关于PHP正则表达式修饰符e。

e (PREG_REPLACE_EVAL):如果这个修饰符设置了, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在 后向引用替换时会被用反斜线转义。

举例:

 代码如下 复制代码


$user_data = array('user_id' => 2, 'username' => 'Mr.Zhang');
$words = 'Hello,<A href="profile#{$user_id}">{$username}</A>';
$hello = preg_replace('/{$([w]+)}/e', "$user->data['${1}']", $words);

echo $hello;

// 输出结果类似为:Hello,<A href="profile#2">Mr.Zhang</A>

 上述是将正则表达式的搜索结果替换与数组对应的键值。

同样,可以对这些搜索结果进行其他的处理。

 

 代码如下 复制代码
$text = "Hello, phper";
$encoded = preg_replace(
       "'(.)'e"
     ,"dechex(ord('\1'))"
     ,$text
);
print "ENCODED: $encodedn";

例子 在 preg_replace() 中使用索引数组

 代码如下 复制代码

<?php
$string = "The quick brown fox jumped over the lazy dog.";

$patterns[0] = "/quick/";
$patterns[1] = "/brown/";
$patterns[2] = "/fox/";

$replacements[2] = "bear";
$replacements[1] = "black";
$replacements[0] = "slow";

print preg_replace($patterns, $replacements, $string);

/* Output
   ======

The bear black slow jumped over the lazy dog.

*/

/* By ksorting patterns and replacements,
   we should get what we wanted. */

ksort($patterns);
ksort($replacements);

print preg_replace($patterns, $replacements, $string);

/* Output
   ======

The slow black bear jumped over the lazy dog.

*/

?>

 


如果 subject 是个数组,则会对 subject 中的每个项目执行搜索和替换,并返回一个数组。

如果 pattern 和 replacement 都是数组,则 preg_replace() 会依次从中分别取出值来对 subject 进行搜索和替换。如果 replacement 中的值比 pattern 中的少,则用空字符串作为余下的替换值。如果 pattern 是数组而 replacement 是字符串,则对 pattern 中的每个值都用此字符串作为替换值。反过来则没有意义了。

/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。


只替换一次

如题,有一段文本
123456<a href="">abcdefg</a>sdfsdafdfabcdffsafd

目标:将第二次出现的abc进行替换,第一次不做操作

 代码如下 复制代码

$test = 'test test test1';
$arr[0] = '/(test)/';
$arr[1] = '/(yjq)/';
$val[0] = 'yjq';
$val[1] = 'test';
$test1 = preg_replace($arr[0], $val[0], $test);
$test1 = preg_replace($arr[1], $val[1], $test1,1);
echo $test.':'.$test1;

或者使用preg_replace函数来操作这个更专业mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] ) 我们只要限制后面的确limit即可

 代码如下 复制代码

<?
function str_replace_limit($search, $replace, $subject, $limit=-1) {

// constructing mask(s)...

if (is_array($search)) {

foreach ($search as $k=>$v) {

$search[$k] = '`' . preg_quote($search[$k],'`') . '`';

}

}

else {

$search = '`' . preg_quote($search,'`') . '`';

}

// replacement

return preg_replace($search, $replace, $subject, $limit);

}

?>

一个更直接的

<?php
 function sst($result,$keys){
  $len=substr_count($result,$keys);
  for($i=1;$i<=$len;$i++){
   $num=$i."、";
   $result=preg_replace("/$keys/",$num,$result,1);
   echo $result."<br/>";
  }

  return $result;
 }

 sst("<xdw>十分士大夫发生发生<xdw>123544++;<xdw>545","<xdw>");

?>