4 Stimmen

Php preg_match erhält Zahlen zwischen zwei Zeichenfolgen

Hallo, ich fange gerade an, PHP Regex zu lernen und habe folgendes Problem: Ich muss die Zahlen innerhalb von $string extrahieren. Das von mir verwendete Regex gibt "NULL" zurück.

$string = 'Clasificación (2194)  ';
$regex = '/Clasificación((.*?))/';
preg_match($regex , $string, $match);
var_dump($match);

Vielen Dank im Voraus.

6voto

Amal Murali Punkte 72895

Es gibt drei Probleme mit Ihrem Regex:

  • Sie escapen nicht den Schrägstrich. Sie verwenden den Schrägstrich als Trennzeichen, daher müssen Sie ihn escapen, wenn Sie ihn als wörtliches Zeichen innerhalb des Ausdrucks verwenden möchten
  • ((.*?)) macht nicht das, was Sie denken. Es erstellt zwei erfassende Gruppen -- eine verschachtelt in der anderen. Ich nehme an, Sie versuchen zu erfassen, was sich innerhalb der Klammern befindet. Dafür müssen Sie die Zeichen ( und ) escapen. Der Ausdruck würde folgendermaßen aussehen: \((.*?)\)
  • Ihr Ausdruck behandelt keine Leerzeichen. In dem von Ihnen gegebenen String befinden sich Leerzeichen zwischen dem und dem Beginn der Nummer -- (2194). Um die Leerzeichen zu ignorieren und nur die Nummer zu erfassen, müssen Sie \s verwenden (das jedes Leerzeichen-Zeichen trifft). Dafür müssen Sie \s*\((.*?)\)\s* schreiben.

Der endgültige reguläre Ausdruck nach Behebung aller oben genannten Fehler sieht wie folgt aus:

$regex = '~Clasificación\s*\((.*?)\)\s*~';

Vollständiger Code:

$string = 'Clasificación (2194)  ';
$regex = '~Clasificación\s*\((.*?)\)\s*~';
preg_match($regex , $string, $match);
var_dump($match);

Ausgabe:

array(2) {
  [0]=>
  string(32) "Clasificación (2194)  "
  [1]=>
  string(4) "2194"
}

Demo.

2voto

Maxime Lorant Punkte 31511

Sie vergessen, das / in Ihrem Regex zu escapen, da Sie das / als Trennzeichen verwenden:

$regex = '/Clasificación<\/a>((.*?))<\/li>/';
//        ^ Trennzeichen    ^^               ^ Trennzeichen
//                       ^^ / in einem String, der escapet ist

Ein anderer Weg kann sein, das Trennzeichen zu ändern, und dann müssen Sie es nicht escapen:

$regex = '#Clasificación<\/a>((.*?))<\/li>#';

Sehen Sie sich die PHP-Dokumentation für weitere Informationen an.

2voto

HazyBlueDot Punkte 125

Sie müssen die Sonderzeichen maskieren, die Sie finden möchten:

$regex = '/Clasificación<\/a> \((.*?)\) <\/li>/'

und möchten Ihren Ausdruck möglicherweise spezifischer machen, wo es darauf ankommt (abhängig von Ihrem Anwendungsfall)

$regex = '/Clasificación<\/a>\s*\(([0-9]+)\)\s*<\/li>/'; 

Dadurch können 0 oder mehr Leerzeichen vor oder nach dem (1234) verwendet werden und es wird nur übereinstimmt, wenn in den Klammern nur Zahlen stehen

Ich habe das gerade in PHP ausprobiert:

php > preg_match($regex , $string, $match);
php > var_dump($match);
array(2) {
  [0]=>
  string(30) "Clasificación (2194)  "
  [1]=>
   string(4) "2194"
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X