>  기사  >  백엔드 개발  >  php Trim 방식 사용으로 인한 문제점 분석

php Trim 방식 사용으로 인한 문제점 분석

不言
不言앞으로
2019-04-13 11:46:152617검색

이 기사는 PHP 트림 방법을 사용하여 발생하는 문제에 대한 분석을 제공합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

Scenario

PHP에서 문자열을 가로채기 전후의 문자에는 ltrim, rtrim, Trim 세 가지 방법이 있습니다.

다음 예에서는 ltrim 방법만 예시로 사용됩니다. 저는 매우 무지합니다. 이 소스 코드를 본 적이 없습니다.) 문자열 왼쪽에 있는 빈 문자열, 빈 탭 문자 등을 삭제하려면 ltrim($str)

만 사용하면 됩니다. 예를 들어, 이제 helloworld 문자열이 있는 경우 지정된 문자를 삭제하고 싶습니다. 머리에 있는 h 문자를 가로채서 직접 var_dump(ltrim("helloworld", "h")); elloworld

위의 모든 내용은 제가 생각한 범위 내에 있으며, 한때 일부 문자열에 대해 openssl_encrypt 암호화를 수행해야 할 필요가 있기 전까지는 항상 이렇게 사용했습니다. 암호화 후 base64를 만든 다음 스플라이스합니다. KO:, 각 암호화가 완료된 후 KO: 문자가 연결됩니다. 마찬가지로, 해독 전에 KO:가 제거되고 해독되는 방법에 관계없이 실패합니다. 나중에 여러 개의 중단점을 만들었고 예상했던 결과가 다르다는 것을 알았습니다.

Recurrence

<?php
// 以下做一个简单的情景复现

$str = "abccabdefg";
$character_mask = “abc”;    

var_dump(ltrim($str,  $character_mask));    // 输出结果为 bdefg,而不是只截取前三位的abc
원인 분석

위의 작은 데모를 마친 후 가장 간단하고 가장 인기 있는 방법은 무엇인지 알아야 합니다. 이전 $str을 한 문자씩 회전 훈련하는 것입니다. 뒤쪽의 $character_mask에 있는지 확인하고 그렇지 않은 경우 실행을 중지합니다. ltrim 코드:

<?php 

$str = "abcccabdecbag";

$res = '';
$character_mask = 'abc';

$arrStr = str_split($str);        // 字符串转数组

for ($i=0; $i<=count($arrStr); $i++) {
        if(strpos($character_mask, $arrStr[$i]) !== false) {
                unset($arrStr[$i]);
        } else {
                break;
        }
}

echo ltrim($str, $character_mask);
echo "\r\n";
echo implode($arrStr);
echo "\r\n";

해결책

해결책은 PHP에서 일부 문자열 조작 기능을 사용하고 더 많은 풀뿌리 판단을 추가하는 것입니다

  if (substr($str, 0, strlen($character_mask)) == $character_mask) {
            echo substr($str, strlen($character_mask));
  }

위 내용은 php Trim 방식 사용으로 인한 문제점 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제