preg_replace () e 수정자를 preg_replace_callback으로 바꾸십시오.
PHPpreg_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.
정규 표현식에서 일치하는 문자열의 일부를 (괄호)로 "캡처"할 수 있습니다. 이 경우 일치 항목의 (^ | _) 및 ([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); }
from https://stackoverflow.com/questions/15454220/replace-preg-replace-e-modifier-with-preg-replace-callback by cc-by-sa and MIT lisence
'PHP' 카테고리의 다른 글
모든 오류 및 경고 표시 (0) | 2018.09.03 |
---|---|
배열을 SimpleXML로 변환하는 방법 (0) | 2018.09.03 |
PHP + 컬, HTTP POST 샘플 코드? (0) | 2018.09.03 |
PHP를 사용하여 cron 작업을 만드는 방법은 무엇입니까? (0) | 2018.09.03 |
foreach ()에 잘못된 인수가 제공되었습니다. (0) | 2018.09.03 |