2017-01-11 25 views
5

Potrzebuję pomocy w wyrenderowaniu php. Jeśli w ciągu znaków znaleźć numer po pewnym znaku. zdobądź tę liczbę i zastąp ją po zastosowaniu matematyki. Podobnie jak przelicznik waluty.Pobierz numer z ciągu znaków po określonym znaku i przekonwertuj ten numer

Zgłosiłem ten regex https://regex101.com/r/KhoaKU/1

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

regex nie skorygować Chcę wszystkie pasujące numer tutaj tylko to dopasowane 40 ale tam również 20,00, 9,95 itd. Próbuję uzyskać wszystko. i przekonwertuj je.

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

tak, to wartość trzeba dopasować jest ' 40'? Czy twoje wyrażenie regularne jest poprawne? –

+0

Czym dokładnie jest problem? – jeroen

+0

@ WiktorStribiżew Brak wyrażeń regularnych niepoprawnych Chcę, aby wszystkie dopasowane liczby tutaj były zgodne tylko z 40, ale są też 20.00, 9.95 itd. Próbuję uzyskać wszystko. i przekonwertuj je. –

Odpowiedz

3

Jeśli wystarczy, aby wszystkie te wartości i konwertować je simpleConvert, użyj regex dla liczb całkowitych/pływakowych i po uzyskaniu wartości, mijamy tablicę 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])); 

See this PHP demo.

Wzór Szczegóły:

  • \b - wiodący słowo granica
  • AUD - sekwencja dosłownym char
  • - przestrzeń
  • (\d*\.?\d+) - Grupa 1 przechwytywanie 0+ cyfr, co stanowi opcjonalnie ., a następnie ponad 1 cyfry.

Należy pamiętać, że $m[1] przekazana do funkcji zawiera zawartość pierwszej (i jedynej) grupy przechwytującej.

Jeśli chcesz zmienić te wartości wewnątrz tekstu wejściowego, sugeruję tego samego wyrażenia regularnego w 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; 

Patrz PHP demo

+1

Użyłem preg_replace_callback zgodnie z twoją sugestią. To zadziałało dla mnie. Dzięki. –