정규 표현식에서 예상치 못한 결과가 발생합니다. 이는 네임 스페이스의 클래스 이름을 대체하기위한 것입니다. 교체 작업이 두 번 발생하여 대체되는 클래스 이름이 복제됩니다 (아래 예 참조).preg_replace double replacement
는 사실은 실제로 더 정확하게 내가 원하는 것에 대해 오히려 0 이상 (*
)보다 1 이상 (+
)와 일치하는 등록의 전을 변경하여 문제를 해결했습니다.
그러나 처음에는 문제가 발생하는 이유에 대해 다소 혼란 스럽습니다. 여기
문제의 예는 다음과 같습니다components\groups\GroupsAccess
이 가능인가요
$classns = 'components\groups\GroupsController';
$newclass = 'GroupsAccess';
$classns = preg_replace('/[^\\\\]*$/', $newclass, $classns);
echo $classns;
결과
components\groups\GroupsAccessGroupsAccess
예상 * 그 단어 경계 또는 뭔가 일치한다 자연?
혼란스러운 부분은 동일한 정규 표현식을 사용하는 preg_match가 하나의 결과 만 표시한다는 것입니다. 따라서 preg_match가 정규식을 실행하는 방법과 관련이있는 것으로 보입니다.
preg_match('/[^\\\\]*$/', $classns, $m);
var_dump($m);
*
는 단어 경계와 일치하지 않는
array(1) { [0]=> string(12) "GroupsAccess" }
'preg_match_all'은 무엇을 보여줍니까? 'preg_match'_always_는 최대 하나의 일치를 보여줍니다. –
@JanDvorak 잘 잡으세요. 그것은 두 경기를 보여줍니다. –
왜 str_replace를 사용하지 않습니까? – Evert