2014-08-28 1 views

답변

2
$numberAsString = trim($string, '@#') 

이 경우 가장 쉽고 빠릅니다. 이 경우 출력은 여전히 ​​문자열이지만 대부분의 경우에는 별 문제가되지 않습니다. 귀하의 경우에 맞는 경우 (int), (float) 등을 사용하여 올바른 유형으로 가져올 수 있습니다. 물론

, 정규식도 가능한 것, 예를 들면 :

$didMatch = preg_match('/@+([^#]+)#+/', $string, $matches); 

또 다른 가능성은 여전히 ​​먼저 초기 2 @ 후 나머지 부분을 추출하고 항상에서 int로 보이는 숫자에 캐스팅 이 경우 :

$number = (int)substr($string, 2); 

가 또 다른 가능성이있을 것이라고는 문자의 수에 의해 이동 한 것처럼 SUBSTR을 사용 :

$numberAsString = substr($string, 2, -2); 

아니면 창조적 폭발 + 내파 + 배열 기능과 같이 사용할 수 있습니다 : 그것은 매우 비효율적이고 같은 물론

$numberAsString = array_slice(explode('#', implode('', array_slice(explode('@', $string), 2))), 0, -2); 

이 마지막 하나는, 그것이 여러 가지 방법으로 수행 할 수 있다는 것을 보여주기 위해 순전히 실용적이지 않지만, 분명히 수십 가지 다른 방법이있다.

타이트한 루프 또는 성능이 중요한 부분에서 이것을 사용하는 경우, 다른 가능성을 벤치 마크 할 것입니다. 추측에 따르면 트림 또는 순수 하위 문자열 솔루션이 가장 빠를 것이라고 말하고 싶습니다.

+0

문자열에 다른 문자가있는 경우 깨질 수 있습니다. –

+0

예, 가능하지만 대답은 여전히 ​​모든 예제에 맞습니다. Btw. preg_match 솔루션은 주어진 질문에서 알지 못하는 플로트를 추출하려는 경우 "끊어지기"때문에이 경우 실제로 사용 가능한 데이터로 귀결됩니다. – griffin

1
$str = "@@563##"; 
preg_match("|\d+|", $str, $res); 
print_r($res); 
0

그냥 filter_var() 함수를 호출하면 숫자 만 반환됩니다.

입력 내용이 무엇이든 상관없이 입력 한 번호 만 필터링합니다!

filter_var("@@120058##", FILTER_SANITIZE_NUMBER_INT) // return 120058 
    filter_var("*##20kkk", FILTER_SANITIZE_NUMBER_INT) // return 20 
관련 문제