2010-12-30 19 views
4

Kann mir jemand sagen, was es genau zu tun versucht?Was bedeutet dieser Regex?

$exp = '/[\s]+col[\s]*=[\s]*"([^"]*)"/si'; 
+1

Es kann komprimiert werden auf '/ \ scol \ s * = \ s *" ([^ "] *)"/i' – marcog

+1

Es bedeutet, dass jemand reguläre Ausdrücke nicht gut versteht. – tchrist

+0

Für diejenigen auf Windows-Plattformen, die Anwendung "RegexBuddy" ist sehr nützlich für das Verstehen und Konstruieren von Mustern. – Scuzzy

Antwort

3

Sie können reguläre Ausdrücke mit Kommentaren schreiben, wenn Sie den Modifikator /x hinzufügen. so hier ist eine langwierige und dokumentierte Version (immer ratsam, für komplexe):

$exp = '/ 
      [\s]+  # one or more spaces 
      col  #  col 
      [\s]*  # zero or more spaces 
      =   #  = 
      [\s]*  # spaces 
      "   #  " 
      ([^"]*) # anything but " and zero or more of it 
      "   #  " 
    /six'; 

auch manchmal Sie [^<">] anstelle von [^"] sehen solche regexps belastbarer gegen malformed html zu machen.

+0

Niedlich, die Regex-Modifikatoren buchstabieren 'sechs'. – BoltClock

+0

Schöne mehrzeilige Syntax ... obwohl manchmal <> in einem Attribut zu finden ist und die meisten Browser es aufnehmen. –

3

Es scheint  col="some value" passend zu werden, während der Leer sehr nachsichtig zu sein um das Gleichheitszeichen, Groß- und Kleinschreibung zu sein, und zwar unabhängig davon, ob der Wert leer ist oder nicht.

Auf einer Randnotiz ist es neugierig, was der s Modifier dort tut, da es keine . Metazeichen gibt.

+0

Kann keinen Grund für sehen die case-insensitive flag obwohl ... –

+0

@Abdullah Jibaly: Ja, wahrscheinlich nur eine sehr nachsichtig Regex. – BoltClock

+1

@Abdullah Damit es übereinstimmt 'COL =" "' auch – marcog

1

Ich denke, andere haben bereits eine gute Antwort gegeben. Als beiseite, wenn dies für Parsen Markup nicht etwas ist, dann könnte man Funktionalität auf der Saite Seite mit etwas steigern wie dieses:

\s+ col \s* = \s* "((?: \\. | [^\\"]+)*)"

Perl'ish wäre:

use strict; 
use warnings; 

my $regex = qr/ 

    \s+ col \s* = \s* "((?: \\. | [^\\"]+)*)" 

/sx; 

my $string = q(
col = " this'' is \" a test\s, 
      of the emergency broadcast system, 
      alright .\". cool." 
); 

if ($string =~ /$regex/) 
{ 
    print "Passed val =\n $1\n"; 

} 
__END__ 

Passed val = 
    this'' is \" a test\s, 
      of the emergency broadcast system, 
      alright .\". cool. 
+0

Lassen Sie mich wissen, ob dies für Sie funktioniert – sln