codehunter
Goto Top

Mit Regular Expression nach einer Zahlenfolge suchen

Hallo allerseits,

ich möchte mit preg_match einen String auseinander nehmen. In dem String kommen neben diversen alphanumerischen Zeichen auch mehrere Zahlenfolgen vor. Eine dieser Zahlenfolgen hat mindestens 12 Stellen (oder mehr) und wird von je einem beliebigen nicht-numerischen Zeichen abgegrenzt.

Ich möchte erreichen, daß die Zahlenfolge mit mindestens 12 oder mehr Stellen durch preg_match separiert wird. Hier Beispiel-Strings:

Es konnte in 5824 Datensätzen ein Gesamtwert von 970222713953 Einheiten zu je 500 Punken ermittelt werden.
oder
Von 5824 Datensätzen mit insgesamt 970222713953 Einheiten zu je 500 Punken werden 824 ausgetragen.

Für mich von Interesse ist die Zahlenfolge 970222713953 die in den beiden Beispiel-Strings vorkommt. Das Erkennungsmerkmal ist die Länge der Zahlenfolge, die in jedem Fall >= 12 ist.

Grüße
Cody

Content-Key: 120450

Url: https://administrator.de/contentid/120450

Printed on: April 19, 2024 at 21:04 o'clock

Member: Arano
Arano Jul 14, 2009, updated at Oct 18, 2012 at 16:38:45 (UTC)
Goto Top
Guten Abend !

Hehe, jetzt habe ich länger für das drum herum gebraucht als für den RegEx selber ^^
<?php

echo 'Hilfe fuer Codehunter ([content:120450];;)  

/* test 1 */
$str = 'Es konnte in 5824 Datensätzen ein Gesamtwert von 970222713953 Einheiten zu je 500 Punken ermittelt werden.';  
echo $str.'<br>Einheiten: "'.getEinheiten($str).'"<br><br>';  
/* return 970222713953 */

/* test 2 */
$str = 'Von 5824 Datensätzen mit insgesamt 970222713953 Einheiten zu je 500 Punken werden 824 ausgetragen.';  
echo $str.'<br>Einheiten: "'.getEinheiten($str).'"<br><br>';  
/* return 970222713953 */

/* mit 10 stellen */
$str = 'Von 5824 Datensätzen mit insgesamt 01234567891 Einheiten zu je 500 Punken werden 824 ausgetragen.';  
echo $str.'<br>Einheiten: "'.getEinheiten($str).'"<br><br>';  
/* return not available */

/* mit buchstaben */
$str = 'Von 5824 Datensätzen mit insgesamt 970222713953d Einheiten zu je 500 Punken werden 824 ausgetragen.';  
echo $str.'<br>Einheiten: "'.getEinheiten($str).'"<br><br>';  
/* return not available */

/* mit langer zahl */
$str = 'Von 5824 Datensätzen mit insgesamt 9702227139530000000000 Einheiten zu je 500 Punken werden 824 ausgetragen.';  
echo $str.'<br>Einheiten: "'.getEinheiten($str).'"<br><br>';  
/* return 9702227139530000000000 */


function getEinheiten($str)
{
    /**
     * $pattern
     * zeichenkette die mit elf zahlen beginnt, mit mindestens einer weitergeht
     * und auf ein leehrzeichen endet. den zahlenteil davon geklammert weil wir
     * das leerzeichen nicht haben moechten
     */
    $strPattern  = '/([0-9]{11}[0-9]+) /';  
    $arrHits     = array();
    $boolFound   = preg_match($strPattern,$str,$arrHits);
    if(FALSE == $boolFound)
        return 'not available';  
    return $arrHits[1];
    /**
     * $arrHits = '123456789123 ' // gesamter ausdruck (mit leerzeichen) 
     * $arrHits[1] = '123456789123'  // erster teilausdruck (erste klammer [ohne leerzeichen]) 
     */
}

?>


Gute Nacht
~Arano
Member: Codehunter
Codehunter Jul 15, 2009 at 06:29:29 (UTC)
Goto Top
Vielen Dank erstmal für deine viele Arbeit! face-smile Ich hab mir letztens erst mühsam die Syntax für die Regular Expressions beigebracht die in den .htaccess für RewriteRules verwendet wird und mußte jetzt feststellen daß PHP-intern bei den RegEx-Funktionen wieder eine andere Syntax gilt.

Wie ich Zahlen usw. definiere in einer Expression war ja auch so nicht das Problem sondern wie ich vorgebe daß es mindestens 12 aufeinanderfolgende sein müssen.

Bei deinem Beispiel gibts noch ein kleines Problemchen. Die gesuchte Zahl beginnt und endet nicht zwangsläufig mit einem Leerzeichen. Im Text kommt praktisch alles vor: Buchstaben, Klammern, Kommatas, Rauten...

Also habe ich noch ein bisschen gehirnt und die Zeile mit dem Pattern so geändert:
$strPattern  = '/([0-9]{11}[0-9]+)[^\d]/';  

Ich hoffe daß ich damit jetzt keine Unschärfen eingebaut habe. Was meinst du? Zumindest an deinem Testscript funktioniert es zuverlässig.
Member: nxclass
nxclass Jul 15, 2009 at 06:57:46 (UTC)
Goto Top
... sollte das nicht auch gehen !?:

$strPattern  = '/([0-9]{12,})/';  
Member: Codehunter
Codehunter Jul 15, 2009 at 07:04:19 (UTC)
Goto Top
@nxclass: Nach dem ersten Test scheint das auch zu funktionieren.

Ich brauch unbedingt mal mehr Literatur zu RegEx. Solche Konstrukte wie "{12,}" habe ich noch nirgends gesehen...
Member: Arano
Arano Jul 15, 2009 at 09:19:23 (UTC)
Goto Top
" Ich brauch unbedingt mal mehr Literatur zu RegEx "
http://www.regular-expressions.info/index.html

" Solche Konstrukte wie "{12,}" habe ich noch nirgends gesehen... "
http://www.regular-expressions.info/reference.html (am ende)

Hier gibts noch ich paar super CheatSheets, sehr pracktisch:
http://www.addedbytes.com/cheat-sheets/


~Arano
Member: nxclass
nxclass Jul 15, 2009 at 18:34:05 (UTC)
Goto Top
CheatSheets : Cool - sowas ist immer nützlich und RegEx ist schon fasst eine Wissenschaft für sich.
Member: Codehunter
Codehunter Jul 16, 2009 at 06:04:51 (UTC)
Goto Top
Seh ich auch so... Habs mir gleich ausgedruckt und einlaminiert face-big-smile

Danke!