Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
preg_match ist Greedy, obwohl der Syntax Ungreedy ist [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-consult PHP Entwicklung
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
preg_match ist Greedy, obwohl der Syntax Ungreedy ist


 
mgutt
03-12-2008, 21:27 
 
Hi,

ich habe ein Problem mit diesem Syntax:
if (preg_match('#<a(.*?href=("|\')' . $www . '[/ ]?("|\').*?)>.*?</a>#is', $content, $matches)) {

das gleiche hier:
if (preg_match('#<a(.*href=("|\')' . $www . '[/ ]?("|\').*)>.*</a>#Uis', $content, $matches)) {

Und zwar sucht er sich den ersten <a und geht dann solange weiter bis der $www gefunden wurde.

Das passiert aber komischerweise nur, wenn im $content erst ein <a href=" kommt und dann der eigentliche $www mit a href=' verlinkt wurde.

Hier der vollständige Test-Code:
$content = '<a href="/">Logo</a>
Content<br />
<a href=\'http://domain.de\'>Link</a>
Footer<br />';
$website = 'http://domain.de';

$www = str_replace('.', '\.', $website);
$matches = array();
if (preg_match('#<a(.*?href=("|\')' . $www . '[/ ]?("|\').*?)>.*?</a>#is', $content, $matches)) {
print_r($matches);
}

Ausgabe $matches:
Array
(
[0] => <a href="/">Logo</a>
Content<br />
<a href='http://domain.de'>Link</a>
[1] => href="/">Logo</a>
Content<br />
<a href='http://domain.de'
[2] => '
[3] => '
)

Ich habe doch extra ungreedy zwischen <a und href= angegeben, also warum verhält er sich trotzdem greedy?

EDIT:
Auch diese Variante gibt $matches[1] wie zuvor aus:
if (preg_match("#<a(.*href='" . $www . "[/ ]?'.*)>.*</a>#Uis", $content, $matches)) {

 
TBT
03-12-2008, 21:42 
 
nach dem <a nicht mit .* weitermachen sondern mit [^<]*

 
mgutt
03-12-2008, 21:43 
 
Gut ist eine Lösung (erstmal danke soweit), aber ich verstehe nicht warum mein Syntax Greedy ist?

 
TBT
03-12-2008, 22:39 
 
weil beim ersten <a anfängt, was er findet, ab denn ist der Ausdruck ungreedy.
Ungreedy bedeutet nicht, das er den Anfang auch weit möglichst nach hinten schiebt, sondern nur, dass er den Ausdruck frühest möglich beendet.

 
mgutt
03-12-2008, 23:15 
 
Ok, geht also nur vorwärts nicht rückwärts. Wieder was gelernt. Das erklärt dann auch warum ich den NOT-Part nur am Anfang setzen muss.

Nochmals Danke!


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:16 Uhr.