2017-10-02 2 views
0

다양한 PHP str_* 함수를 시도했지만, 필요한 것을하기 위해 replace, explode() 등의 올바른 조합을 찾을 수 없습니다. 서비스 ID의문자열 내에서 문자열로 변수를 채우십시오.

조건 : : # 928374 (발 : $ 2.50,시 추가 요금 :

나는 일부 특정 아래 -EX 문자열에있을 것입니다 텍스트를 잡아 할 10.25 %)

문자열 부분은 굵게 표시되어 있습니다. 나는 그 주요 문자열에서 그들을 잡아야합니다. 이 굵게 표시된 값은 사용자 당 여러 번 변경되므로 실제로 나를 버리게됩니다. 굵게 표시되지 않은 텍스트는 일관 적이거나 상수입니다.

내가 시도하고있는 것이 달성 될 수 있는지 아는 사람이 있습니까? 그렇다면 약간의 안내/통찰력을 제공해 주시겠습니까? 많이 감사하겠습니다.

+0

는 단지 루프 후, 공간 폭발 # ..., $ ... 확인하고 ... % – rtfm

답변

1

정적 대부분의 값, 당신은 대체 할 수있는 점을 감안합니다 (대부분의) 정적 차 결과에서 $% 문자 제외 문자열에서 값을 추출하고 공백으로 분해합니다. 그런 다음 세 개의 값 (값을 쉼표로 표시하여 제거 할 수 있음)이 표시됩니다.

  • $replace = array("Terms of Service ID: #", "(Val: $", "Add'l fee: ", "%)"); 
    $string = "Terms of Service ID: #928374 (Val: $2.50, Add'l fee: 10.25%)"; 
    
    $result = str_replace($replace, "", $string); // Replace static strings 
    $pieces = explode(" ", $result);    // Explode on spaces, get pieces 
    $pieces[1] = rtrim($pieces[1], ",");   // Trim away the trailing comma 
    
    $id = $pieces[0]; 
    $value = $pieces[1]; 
    $fee_percent = $pieces[2]; 
    
    Live demo
+0

절대적인 광휘 - 감사합니다 !!!! – user1176783

3

이에 대한 정규 표현식 사용을 고려할 수 있습니다 다음

$str = "Terms of Service ID: #928374 (Val: $2.50, Add'l fee: 10.25%)"; 
$pattern = '/Terms of Service ID: (#[0-9]+) \(Val: (\$[0-9\.]+), Add\'l fee: ([0-9\.]+%)\)/'; 
$matches = array(); 
preg_match($pattern, $str, $matches); 

그것의 단지 인덱스 1, 2의 $matches 배열에 캡처 된 값을 액세스하는 문제, 그리고 (3)


편집

다음은 서식을 변경하는 데 더 저항력이 있어야하는보다 컴팩트 한 정규 표현식입니다. 이 특정 예를 들어

$str = 'Terms of Service ID: #928374 (Val: $2.50, Add\'l fee: 10.25%)'; 
$pattern = '/(#[0-9]+)[^\$]+\$([0-9\.]+)[^0-9]+([0-9\.]+)%/'; 
$matches = array(); 
preg_match($pattern, $str, $matches); 

출력은 다음과 같습니다 :

$matches = array(
    "#928374 (Val: $2.50, Add'l fee: 10.25%", //matched from the entire regular expression 
    "#928374", //first capture group 
    "2.50",  //second capture group 
    "10.25"  //third capture group 
); 
+0

나는이 버전을 좋아하지만, 그냥 빨리 작동시킬 수 없습니다. 제가 기회가 생기면, 제가 빠진 것을보기 위해 더 많이 가지고 놀고 싶습니다. 귀하의 의견에 많은 감사드립니다. – user1176783

+0

캡처 그룹이 약간 잘못되었을 수 있습니다. 캡처 그룹은 나중에 일치 패턴을 참조 할 수있는 괄호 세트입니다. 이 경우 괄호가 세 세트이므로 참조 할 수있는 세 가지 그룹이 있습니다. 옆에 기호가없는 숫자가 필요한 경우 해당 기호를 해당 캡처 그룹 외부로 옮기면됩니다.정규 표현식을 일반적으로 더 자세히 살펴 보는 것이 좋습니다. 일반적으로 이러한 패턴 일치 문제를 훨씬 쉽게 만듭니다. –

-1

이 문제에 대한 정규식을 사용할 수 있습니다.

시간이 있다면 가져 오려는 다른 것들에 대해 무언가를 바이올린 할 것입니다.

$str = 'Terms of Service ID: #928374 (Val: $2.50, Add\'l fee: 10.25%)'; 
$id = preg_match('/#[0-9]*/', $str, $matches)[0]; 
$val = preg_match(/\$[0-9]*\.[0-9]*/, $str, $matches)[0];