2011-01-04 14 views
1

Ich versuche, die folgenden RegexMuster zu nutzen:Regex Problem in PHP

$regex = '/Name: [a-zA-Z ]*] [0-9]/'; 

Wenn es in Rubular testen, es funktioniert gut, aber wenn PHP mit dem Ausdruck nie true zurück, auch wenn es sein sollte. Übrigens, wenn ich den "[0-9]" Teil entferne, funktioniert es gut. Gibt es einen Unterschied in der PHP-Regex-Syntax, die ich übersehen habe?

Bearbeiten: Ich bin auf der Suche nach den Zeichen "Name:" dann ein Name mit einer beliebigen Anzahl von Buchstaben oder Leerzeichen, dann ein "]", dann ein Leerzeichen, dann eine einzelne Zahl. So "Name: Chris] 5" würde True zurückgeben und "Name: Chris] [Lorem Ipsum]" sollte false zurückgeben.

Ich versuchte auch, die zweite Klammer "\[" zu entkommen, aber das behob das Problem nicht.

+3

Sie haben nicht gesagt, was Sie versuchen zu entsprechen. Auch das zweite ']' ist literal auf PHP und Ruby, also passt man etwas wie 'Name: _Hallo World] _4' an (Unterstriche für obligatorische Leerzeichen, nur damit wir sie sehen können) – Kobi

+2

zuerst, was versuchst du zu erreichen? Geben Sie –

+0

Beispielzeichenfolgen an, die Sie abgleichen möchten und auf die regex den Wert true zurückgeben soll. – Badr

Antwort

1

Es ist nicht klar ohne Beispiele, was Ihr Anwendungsfall, aber es scheint, als ob Sie so etwas wollen?

$regex = '/Name\:\ ([\w]+)\ ([\w]+)/'; 

Update: versuchen Sie dies:

$regex = '/Name\:\ [\w\s]+?\]\ [\d]{1}/'; 

Für mich dieser Spiele

Name: Foo Bar] 2 

..aber nicht diese:

Name: Foo Bar] foo 
Name: Foo Baz 5 

Ich bin auch mit kurz- Handausdrücke für Zeichenklassen:

  • [\ w] ist die Abkürzung für [a-zA-Z0-9] (zB alle alphanumerischen Zeichen)
  • [\ s] entspricht jedem Leerzeichen
  • [\ d] eine beliebige Anzahl

Zur Sicherheit verwende ich auch das '?' um nicht gierig zu sein, um sicherzustellen, dass thw [\ w \ s] + nicht zu viel von der Zeichenfolge konsumiert.

+0

Entschuldigung für das Fehlen von Beispielen. Ich werde meinen Beitrag jetzt bearbeiten. – Chris

0

ich denke, das könnte wegen der Platz in der Regex auch Sie wollen die zweite]. versuchen

$regex = '/Name:\s[a-zA-Z ]*\]\s[0-9]/'; 

oder ein Modifikator

$regex = '/Name: [a-zA-Z ]*\] [0-9]/x'; 

mehr auf Modifikatoren verwenden hier PHP: Possible modifiers in regex patterns - Manual

+0

Leider hat keiner von denen gearbeitet. Außerdem, wie ich im ursprünglichen Post gesagt habe, gibt das Skript true zurück, wenn ich den [0-9] -Teil entferne. Obwohl es sinnvoll ist, dieser zweiten Klammer zu entkommen, glaube ich nicht, dass das das Problem verursacht. – Chris

0

Ihre Regex funktioniert für mich gut mit den beiden Beispielen Sie gab.

$arr = array('Name: Chris] 5', 'Name: Chris] [lorem ipsum]'); 
foreach ($arr as $str) { 
    if (preg_match('/Name: [a-zA-Z ]*] [0-9]/', $str)) { 
     echo "$str : OK\n"; 
    } else { 
     echo "$str : KO\n"; 
    } 
} 

Ausgang:

Name: Chris] 5 : OK 
Name: Chris] [lorem ipsum] : KO 

mehr als ein Raum sein kann zwischen ] sind und die Ziffer, so sollten Sie Ihre regex sein:

[a-zA-Z ]*]\s+[0-9]/ 
0

Ich landete das Auflösungs Problem durch den Versuch verschiedene Regexe, die im Grunde die gleiche Sache taten. Dies ist, was Arbeit endete:

$regex = '/Name: [\w ]*][^[]{2}/'; 

Offenbar ist die Klammern nicht das Problem waren, aber es war etwas in meinem ursprünglichen Code, der nicht richtig funktioniert. Danke euch allen für die Hilfe.