복붙노트

preg_replace () e 수정자를 preg_replace_callback으로 바꾸십시오.

PHP

preg_replace () e 수정자를 preg_replace_callback으로 바꾸십시오.

나는 정규 표현식에 끔찍하다. 나는 이것을 대체하려고 노력하고있다 :

public static function camelize($word) {
   return preg_replace('/(^|_)([a-z])/e', 'strtoupper("\\2")', $word);
}

preg_replace_callback과 익명의 함수. \\ 2 무엇을하는지 이해가 안 돼요. 또는 그 문제에 대한 정확한 preg_replace_callback 작동 방법.

이것을 달성하기위한 올바른 코드는 무엇입니까?

해결법

  1. ==============================

    1.

    정규 표현식에서 일치하는 문자열의 일부를 (괄호)로 "캡처"할 수 있습니다. 이 경우 일치 항목의 (^ | _) 및 ([a-z]) 부분을 캡처하고 있습니다. 이 번호는 1부터 번호가 매겨 지므로 1과 2의 역 참조가 있습니다. 0은 전체 일치 문자열입니다.

    / e 수정자는 치환 문자열을 사용하고 백 슬래시 다음에 숫자 (예 : \ 1)를 적절한 역 참조로 대체합니다. 그러나 문자열 안에 있기 때문에 백 슬래시에서 벗어나야하므로 '\\ 1'. 그런 다음 (결과적으로) 결과 문자열을 PHP 코드처럼 실행하기 위해 eval을 실행합니다 (안전하지 않은 방식으로 eval을 사용하기 쉽기 때문에 더 이상 사용되지 않습니다).

    preg_replace_callback 함수는 대신 콜백 함수를 사용하여 일치하는 역 참조를 포함하는 배열을 전달합니다. 따라서 '\\ 1'을 쓰면 그 매개 변수의 요소 1에 액세스합니다 (예 : function ($ matches) {...} 형식의 익명 함수가있는 경우 첫 번째 역 참조는 해당 함수 내에서 $ matches [1]입니다.

    그래서 / a의 인수

    'do_stuff(\\1) . "and" . do_stuff(\\2)'
    

    콜백이 될 수있다.

    function($m) { return do_stuff($m[1]) . "and" . do_stuff($m[2]); }
    

    또는 귀하의 경우

    'strtoupper("\\2")'
    

    될 수있다

    function($m) { return strtoupper($m[2]); }
    

    $ m와 $ matches는 마술 이름이 아니며, 콜백 함수를 선언 할 때 내가 준 매개 변수 이름 일뿐입니다. 또한 익명 함수를 전달할 필요가 없습니다. PHP의 콜백과 마찬가지로 함수 이름이 문자열이거나 array ($ object, $ method) 형식 일 수 있습니다.

    function stuffy_callback($things) {
        return do_stuff($things[1]) . "and" . do_stuff($things[2]);
    }
    $foo = preg_replace_callback('/([a-z]+) and ([a-z]+)/', 'stuffy_callback', 'fish and chips');
    

    모든 함수와 마찬가지로 콜백 외부의 변수 (주변 범위에서)는 기본적으로 액세스 할 수 없습니다. 익명 함수를 사용할 때, PHP 매뉴얼에서 설명한 것처럼, use 키워드를 사용하여 액세스해야하는 변수를 가져올 수 있습니다. 예 : 예전의 주장이

    'do_stuff(\\1, $foo)'
    

    새로운 콜백은 다음과 같이 보일 것이다.

    function($m) use ($foo) { return do_stuff($m[1], $foo); }
    
  2. from https://stackoverflow.com/questions/15454220/replace-preg-replace-e-modifier-with-preg-replace-callback by cc-by-sa and MIT lisence