2017-01-11 19 views
5

Tôi cần trợ giúp trong regex php. Nếu trong một chuỗi tìm số sau một số ký tự. lấy số đó và thay thế bằng sau khi áp dụng toán học. Giống như chuyển đổi tiền tệ.Lấy số từ một chuỗi sau ký tự cụ thể và chuyển đổi số đó

tôi áp dụng regex này https://regex101.com/r/KhoaKU/1

([^ \?] ) AUD (\ d)

regex không chính xác tôi muốn tất cả số lần xuất hiện ở đây chỉ nó phù hợp 40 nhưng có cũng 20,00, 9,95 vv .. Tôi đang cố gắng để có được tất cả. và chuyển đổi chúng.

function simpleConvert($from,$to,$amount) 
{ 
    $content = file_get_contents('https://www.google.com/finance/converter?a='.$amount.'&from='.$from.'&to='.$to); 

    $doc = new DOMDocument; 
    @$doc->loadHTML($content); 
    $xpath = new DOMXpath($doc); 

    $result = $xpath->query('//*[@id="currency_converter_result"]/span')->item(0)->nodeValue; 
    return $result; 
} 

$pattern_new = '/([^\?]*)AUD (\d*)/'; 
if (preg_match ($pattern_new, $content)) 
{ 
    $has_matches = preg_match($pattern_new, $content); 
    print_r($has_matches); 
    echo simpleConvert("AUD","USD",$has_matches); 
} 
+0

Vì vậy, giá trị mà bạn cần phải phù hợp là ' 40'? Regex của bạn có đúng không? –

+0

Chính xác thì vấn đề là gì? – jeroen

+0

@ WiktorStribiżew Không regex không chính xác Tôi muốn tất cả các số phù hợp ở đây chỉ có phù hợp với 40 nhưng cũng có 20,00, 9,95 vv .. Tôi đang cố gắng để có được tất cả. và chuyển đổi chúng. –

Trả lời

3

Nếu bạn chỉ cần để có được tất cả những giá trị và chuyển đổi chúng với simpleConvert, sử dụng một regex cho số nguyên/float và sau khi nhận được các giá trị, vượt qua mảng để array_map:

$pattern_new = '/\bAUD (\d*\.?\d+)/'; 
preg_match_all($pattern_new, $content, $vals); 
print_r(array_map(function ($a) { return simpleConvert("AUD", "USD", $a); }, $vals[1])); 

Xem this PHP demo.

Pattern chi tiết:

  • \b - một từ hàng đầu ranh giới
  • AUD - một char literal chuỗi
  • - một không gian
  • (\d*\.?\d+) - Nhóm 1 chụp 0+ chữ số, một tùy chọn . và sau đó 1+ chữ số.

Lưu ý rằng $m[1] được chuyển vào hàm simpleConvert chứa nội dung của nhóm chụp đầu tiên (và duy nhất).

Nếu bạn muốn thay đổi những giá trị bên trong văn bản đầu vào, tôi đề nghị các regex tương tự trong một preg_replace_callback:

$content = "The following fees and deposits are charged by the property at time of service, check-in, or check-out.\r\n\r\nBreakfast fee: between AUD 9.95 and AUD 20.00 per person (approximately)\r\nFee for in-room wireless Internet: AUD 0.00 per night (rates may vary)\r\nFee for in-room high-speed Internet (wired): AUD 9.95 per night (rates may vary)\r\nFee for high-speed Internet (wired) in public areas: AUD 9.95 per night (rates may vary)\r\nLate check-out fee: AUD 40\r\nRollaway beds are available for an additional fee\r\nOnsite credit card charges are subject to a surcharge\r\nThe above list may not be comprehensive. Fees and deposits may not include tax and are subject to change."; 
$pattern_new = '/\bAUD (\d*\.?\d+)/'; 
$res = preg_replace_callback($pattern_new, function($m) { 
    return simpleConvert("AUD","USD",$m[1]); 
}, $content); 
echo $res; 

Xem PHP demo

+1

Tôi đã sử dụng preg_replace_callback theo đề xuất của bạn. Nó làm việc cho tôi. Cảm ơn. –

Các vấn đề liên quan