2017-01-11 21 views
5

Regex php'de yardıma ihtiyacım var. Dizede bir karakterin ardından bir sayı bulunursa. Bu numarayı alın ve matematik uyguladıktan sonra değiştirin. Para birimi dönüştürme gibi.Belirli bir karakterden sonra bir dizgiden sayı alın ve bu numarayı dönüştürün

Ben https://regex101.com/r/KhoaKU/1

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

regex burada sadece 40 eşleşti onca eşleşti numara istiyorum düzeltmez bu regex uygulanan ancak orada Ayrıca 20.00, 9.95 vb. hepsini almaya çalışıyorum. ve onları dönüştürün. Sadece tüm bu değerleri almak ve simpleConvert onları dönüştürmek, tamsayı/reel sayılara yönelik ve değerleri aldıktan sonra bir normal ifadeler kullanabilirsiniz gerekiyorsa

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

Bkz eşlenmesi gerekiyorsa değer 'dır 40'a? Regex'iniz doğru mu? –

+0

Tam olarak sorun nedir? – jeroen

+0

@ WiktorStribiżew Hayır regex doğru değil Burada tüm eşleşen sayı istiyorum sadece 40 ile eşleşti ama aynı zamanda 20.00, 9.95 vb. Ben her şeyi almaya çalışıyorum. ve onları dönüştürün. –

cevap

3

, array_map için dizisi geçirmek:

$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])); 

bakın this PHP demo.

Desen detayları:

  • \b - lider kelime sınırı
  • AUD - değişmez bir karakter dizisi
  • - bir boşluk
  • (\d*\.?\d+) - Grup 1 0+ basamak, bir yakalama İsteğe bağlı . ve sonra 1+ basamak. $m[1]simpleConvert işleve geçirilen bu

Not ilk (ve tek) yakalama grup içeriğini tutar.

giriş metninde içindeki bu değerleri değiştirmek isterseniz

, ben preg_replace_callback aynı regex önermek:

$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; 

Yani PHP demo

+1

Önerinize göre preg_replace_callback'i kullandım. Benim için çalıştı. Teşekkürler. –

İlgili konular