2017-03-20 3 views
1

온라인 회계 사이트로 데이터를 전달하는 모듈에서 작업하고 있으며 올바르게 구문 분석하기 위해해야하는 한 가지 방법은 a의 가격에서 통화 기호를 제거하는 것입니다. 생성물.regex - 통화 기호 제거 문제

$regex = '/^\D?([\d\.,]*)\D?$/is'; 

내가 https://regex101.com/ 웹 사이트에이 테스트를했는데 제대로 작동하지만이 preg_replace을 수행 할 때 다음과 같이 :

$price_no_curr = preg_replace($regex,"$1",$product_price); 

$product_price을 다음과 같이

내 정규식 패턴은 예를 들어 £ 123.45 인 경우 $price_no_curr은 처음 123.45 파운드로 반환됩니다. 그래서, 그것을 플로트에 던지면 아무것도 돌려주지 않습니다.

어디에서이 정규식에 문제가 있습니까?

답변

1

간단한 솔루션은 UTF-8 문자를 지원하기 위해 /u 수정을 사용합니다.

$regex = '/^[^\d\.,]?([\d\.,]*)[^\d\.,]?$/u'; 
$price_no_curr = preg_replace($regex,"$1",$product_price); 
0

£는 ASCII 범위 밖에와 UTF-8 인코딩 될 몇 바이트를 필요로 기본적으로

$a="£"; 
echo implode(' ', array_map(function ($i) { 
    return dechex(ord($i)); 
}, str_split($a))); 
// c2 a3 

정규식 엔진 바이트 (한 바이트 = 10 문자)에 의해 바이트를 작동한다. 따라서 \D£의 두 바이트와 일치 할 수 없습니다.

멀티 바이트 문자열과 함께 작동 시키려면 u 수정자를 켜야합니다. 이렇게하면 정규 표현 엔진은 인코딩에 사용 된 바이트 수에 상관없이 문자열별로 문자를 읽습니다. 귀하의 패턴은 다음과 같이 쓸 수있다 :

$regex = '/^\D?([\d.,]*)\D?$/u'; 

하지만 당신은 당신의 한정사 변경하는 경우 당신은 또한 U 수정없이 작업을 수행 할 수 있습니다

$regex = '/^\D*([\d.,]*)\D*$/'; 

더 간단하고 유연한 방법 모두를 제거하는 구성을 그

$str = preg_replace('~[\p{Sc}\s]+~u', '', $str); 

\p{Sc}는 유니 코드 문자 제공자 라이선스 계약되어 통화 및 자신의 위치를 ​​고려하지 않고 결국 화이트 공간입니다 s는 모든 통화 기호를 포함합니다.

이상의 근본적 :

$str = preg_replace('~[^\d.,]+~u', '', $str); 

또는 정규식없이

:

$str = '£1823.45'; 
$allowed_chars = [0,1,2,3,4,5,6,7,8,9,'.',',']; 
echo implode('', array_intersect(str_split($str), $allowed_chars));