如何为regexp重写这个方便的转义特殊字符函数

时间:2013-11-20 12:23:23

标签: php regex

根据这个SO answer,在任何正则表达式中,我需要在字符类之外转义这些字符。

.^$*+?()[{\|

我有以下内容:

$search = "App::uses('Controller', 'Controller');";

$replace = $search . "\nApp::uses('CrudControllerTrait', 'Crud.Lib');";
$escaped_search = escape_special_characters($search);

$patterns = array('/' . $escaped_search . '/');
$replacements = array($replace);
$file_contents = preg_replace($patterns, $replacements, $file_contents);

preg_replace将失败,因为我需要转义(变量中的$search

这就是我有这个功能的原因:

function escape_special_characters($search) {
  $special_characters = array(
    ".", "^", "$", 
    "*", "+", "?",
    "(", ")", "[",
    "{", "|", "\\"
  );

  $character_array = str_split($search);
  $string_array = array();
  foreach ($character_array as $character) {
    if (in_array($character, $special_characters)) {
      $string_array[] = "\\";
    }
    $string_array[] = $character;
  }

  return implode("", $string_array);

}

我的问题是除了我的escape_special_characters功能之外,还有更好的方法吗?

=============================================== =========================

一些背景:

为什么我上面编写了我的代码?

我的目的是寻找第App::uses('Controller', 'Controller');行并在第App::uses('CrudControllerTrait', 'Crud.Lib'); 之后写下<。p>行。

1 个答案:

答案 0 :(得分:1)

您无需创建函数来转义模式中的“丑陋”字符。

你有两种方法可以做到这一点:

$pattern = '~' . preg_quote($search, '~') . '~'; // to escape special characters and the delimiter

$pattern = '~\Q' . $search . '\E~'; // to ignore special characters

但是,我不明白你为什么使用preg_replace()函数而不是str_replace()函数,因为你似乎在查找文字字符串。