一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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

时间:2022-06-25 02:44:39 编辑:袖梨 来源:一聚教程网

1、preg_replace的用途及使用方法

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

正则替换

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

语法:

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

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

 代码如下 复制代码

$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,{$username}';
$hello = preg_replace('/{$([w]+)}/e', "$user->data['${1}']", $words);

echo $hello;

// 输出结果类似为:Hello,Mr.Zhang

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

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

 

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

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

 代码如下 复制代码

$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() 的行中出现语法解析错误。


只替换一次

如题,有一段文本
123456abcdefgsdfsdafdfabcdffsafd

目标:将第二次出现的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);

}

?>

一个更直接的

 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."
";
  }

  return $result;
 }

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

?>


 

热门栏目