2017-05-10 2 views
-1

$data = 'this is appLe and ApPle';
$search = 'apple'; // 예를 들어 찾는이 $search을 사용하는 방법 많은 단어 $search = array("apple","pear") // $replace = array("pen","pupil")
PHP : 배열 버전을 올바르게 작성하는 방법은 무엇입니까?


$replace = 'pear';와 배열 방법 $ 검색에서 배열 단어를 사용하고 $ 대체하는이 기능을 변환?

$data = preg_replace_callback('/\b'.$search.'\b/i', function($matches) use ($replace) 
{ 
    $i=0; 
    return join('', array_map(function($char) use ($matches, &$i) 
    { 
     return ctype_lower($matches[0][$i++])?strtolower($char):strtoupper($char); 
    }, str_split($replace))); 
}, $data); 

답변

1

키와 값의 배열을 작성하고 대소 문자를 구별 방법으로 전체 단어로 키 (또는 간단한 /\b\w+\b/ 정규식 단어에 맞게)와 테스트의 경우에 맞게 동적 패턴을 구축하기 위해 키를 사용하여 키가 배열 안에 있습니다 (!empty($arr[strtolower($matches[0])]) 포함). 존재하는 경우, 발견 된 일치 값을 사용하십시오.

$data = 'this is appLe and ApPle and also a pEar here'; 
$search = array("apple","pear"); 
$replace = array("pen","pupil"); 
$arr = array_combine($search, $replace); 
$pat = '/\b(?:' . implode("|", array_keys($arr)) . ')\b/i'; 
$data = preg_replace_callback($pat, function($matches) use ($arr) 
{ 
    $i=0; 
    return !empty($arr[strtolower($matches[0])]) ? join('', array_map(function($char) use ($matches, &$i) 
    { 
     return ctype_lower($matches[0][$i++])?strtolower($char):strtoupper($char); 
    }, str_split($arr[strtolower($matches[0])]))) : $matches[0]; 
}, $data); 
echo $data; // => this is pen and PeN and also a pUpiL here 

PHP demo을 참조하십시오.

+1

잘 작동하지만 한 가지 문제가 있습니다. ** 배 **를 입력하면 스크립트가 약간 잘못 작동하고 응답으로 ** PupiL ** 및 ** Pupil **이 표시됩니다. 왜 이런 일이 일어나는 걸까요? 어떻게이 문제를 해결할 수 있습니까? 그리고이 스크립트가 ** Cyrillici **와 같은 다른 코드 작성에서 작동하도록 만드는 방법은 무엇입니까? – Otabek

+0

*이 * 질문에 배열 지원 만 추가 할 것을 요청했다고 생각합니다. 다른 사람이 있으시면 언제든지 물어보십시오. 여기에 힌트가 있습니다 : 유니 코드 문자열 처리를 활성화하려면 regex (' '/ \ b (?: implode ("|, array_keys ($ arr)))에'u' 수정자를 추가하십시오. b/iu ';') 그리고'strto ...'를'mb_strto ... '로 대체하십시오. 'ctype_lower'는'preg_match ('~^\ p {Ll} + \ z ~ u', $ m)'로 바꿀 수 있습니다. –

+1

$ data = 'Alex는 집에 고양이가 많습니다.'; $ search = array ("apple", "pear", "alex"); $ replace = array ("pen", "pupil", "александр"); $ search = array_map ("utf8_encode", $ search); $ replace = array_map ("utf8_encode", $ replace); $ arr = array_combine ($ search, $ replace); $ arr = array_map ("utf8_encode", $ arr); ' – Otabek

관련 문제