2017-10-02 7 views
0

Ich habe verschiedene PHP str_* Funktionen versucht, aber kann nicht die richtige Kombination von ersetzen, explode() usw. zu tun, was ich brauche.Befüllen Variablen mit Zeichenfolgen aus einer Zeichenfolge

Ich möchte einige bestimmten Text ergreifen, die -Ex unten in einem String sein:

Nutzungsbedingungen ID: # 928374 (Val: $ 2,50, Add'l Gebühr: 10.25%)

Beachten Sie die fett gedruckten Stringteile. Ich muss sie von dieser Hauptsaite ergreifen. Diese fettgedruckten Werte ändern sich natürlich mehrmals pro Benutzer, was mich wirklich abschreckt. Der nicht fett formatierte Text ist konsistent/konstant.

Weiß jemand, ob das, was ich versuche, erreicht werden kann? Wenn ja, könnten Sie bitte eine Anleitung/Einsicht geben? Würde sehr geschätzt werden.

+0

auf Platz explodieren, dann nur Schleife Sie und überprüfen # ..., $ ... und ...% – rtfm

Antwort

1

Da die meisten der Werte statisch sind, können Sie (die meisten der) statisch ersetzen Werte aus der Zeichenfolge und explodieren auf Leerzeichen. Dann bleiben die drei Werte übrig (mit einem Komma für die Werte, die Sie wegschneiden können).

$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]; 
+0

Absolute Brillanz - Danke !!!! – user1176783

3

Sie betrachten könnte einen regulären Ausdruck für diese Verwendung:

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

Dann ist es nur eine Frage der 1 in Indizes die erfassten Werte in der $matches Array zugreifen, 2 und 3.


Bearbeiten

Hier ist ein kompakterer regulärer Ausdruck, der gegenüber Formatierungsänderungen resistenter sein sollte nd schließt die $ und % Zeichen aus den Ergebnissen:

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

Ausgang für dieses spezielle Beispiel ist:

$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

Ich mag diese Version, aber konnte einfach nicht bekommen es schnell zu arbeiten. Wenn ich eine Chance habe, würde ich gerne mehr damit spielen, um zu sehen, was ich vermisse. Vielen Dank für Ihre Eingabe. – user1176783

+0

Es könnte sein, dass ich die Capture-Gruppen etwas falsch verstanden habe. Erfassungsgruppen sind ein Satz von Klammern, mit denen Sie später auf ein übereinstimmendes Muster verweisen können. In diesem Fall gibt es drei Sätze von Klammern. Sie haben also drei verschiedene Gruppen, auf die Sie verweisen können. Wenn Sie die Nummern ohne die Symbole neben ihnen benötigen, verschieben Sie diese Symbole einfach außerhalb ihrer jeweiligen Erfassungsgruppen.Ich ermutige Sie, reguläre Ausdrücke im Allgemeinen genauer zu betrachten, da sie diese Mustererkennungsprobleme normalerweise wesentlich erleichtern. –

-1

Sie können regex für dieses Problem verwenden.

Wenn Sie eine Minute haben, werde ich etwas für die verschiedenen Dinge giddle, die Sie abrufen möchten.

$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]; 
Verwandte Themen