RegEx-Problem
Danny
- php
Hallo,
es soll ein Teilstring in Anführungszeichen ermittelt werden. Zugelassen sind " und ' wobei innerhalb der Anführungszeichen diese auch maskiert vorkommen können. Bsp:
<a href="foo.html" title="das ist ein "Test" id="test">
Wie gebe ich dem RegEx-Interpreter zu verstehen, das der Teil von " oder ' bis zum nächsten solchen Anführungszeichen incl. maskierter Anführungszeichen gespeichert werden soll ?
Mein Ansatz:
(\s+) # 1. Leerzeichen vor Attrname (muß min. 1)
(\S+) # 2. Attrname
(\s*) # 3. Leerzeichen vor Gleichzeichen (kann)
=
(\s*) # 4. Leerzeichen vor Anführungszeichen (kann)
(["'])? # 5. Anführungszeichen (kann)
(?(5) # wenn Anführungszeichen
(.*?)\5 # dann Attrwert = Zeichenkette bis zum nächsten Anführungszeichen
| ([^\s>]+) # sonst Attrwert = Zeichenkette bis zum nächsten Leerzeichen, bzw. Tagende
Das Problem:
(.*?)\5
Damit wird ja der kürzeste Weg gewählt, also nur z.B. " bis " gesucht und nicht von " über " bis "
Lasse ich das Fragezeichen jedoch weg, funktioniert es auch nicht, die einzelnen Attribute werden nicht mehr einzeln erkannt...
Trotz nachschlagen im PHP-Manual komme ich nicht drauf.
MfG
hi,
in perl würde das so ausschauen:
$string = qq{dfaksdjföaksjdfaöskdf lsk dfkjd f klsdf anf "d asödf "jsdflajsdf" öklsadfj sdfj" end werjj wer wer wjer};
$string =~ s/"(.*)"//;
^ ist in php die funktion ereg_replace
print $1;
php-regex:
http://www.phpfreaks.com/tutorials/52/0.php
http://www.phpfreaks.com/tutorials/63/0.php
lg, lois
$string =~ s/"(.*)"//;
^ ist in php die funktion ereg_replace
print $1;
um $1 verwenden zu können können musst du vielleicht statten ereg_replace preg_replace verwenden (perl compatibel - ist etwas her bei mir mit php)
$a=preg_replace('/"(.*)"/','');
$string = $1;
Hi,
danke für den Tipp! Das funktioniert aber so nicht, eben weil " auch in der Zeichenfolge " vorkommt und der komplette Bereich von " über " bis " gesucht wird... Außerdem kann ich auch nicht nach " und folgendem Leerzeichen als Ende suchen, womit das Problem evtl. umgangen werden könnte, weil ja auch mal z.B. "foo" bar" vorkommmen kann. Eine Lösung wäre die Zeichenfolge " durch "e; temporär zu ersetzen oder ein paar String-Funktionen zu benutzen, was ich auch gleich mal ausprobieren werde.
MfG
Hallo Danny,
es soll ein Teilstring in Anführungszeichen ermittelt werden. Zugelassen sind " und ' wobei innerhalb der Anführungszeichen diese auch maskiert vorkommen können. Bsp:
<a href="foo.html" title="das ist ein "Test" id="test">
ich habe mal ein wenig rumgespielt. Jetzt bin ich aber zu müde, ab hier kannst du weiter machen.
<?php error_reporting(E_ALL);
header("Content-type: text/plain ");
define ( 'nl' , "\n" ) ;
// ---------------------------------
$html ='<a href = "foo.html" title= "das \\ist ein \"Test" id ="test" blub = "" >' ;
echo $html . nl.nl ;
$pattern = '#(\S+)\s*=\s*(""|"\\\\"|"[^"\\]"|"[^"].*?[^\\]")#s';
echo '$pattern = '.$pattern .nl.nl ;
preg_match_all ($pattern , $html , $matches ) ;
print_r ( $matches );
/* Ausgabe
Array
(
[0] => Array
(
[0] => href = "foo.html"
[1] => title= "das \ist ein "Test"
[2] => id ="test"
[3] => blub = ""
)
[1] => Array
(
[0] => href
[1] => title
[2] => id
[3] => blub
)
[2] => Array
(
[0] => "foo.html"
[1] => "das \ist ein "Test"
[2] => "test"
[3] => ""
)
)
*/
?>
Gruß
Christian
Cool! Tausend Dank! :)