Servus,
Hier trifft zu, was ich Dir beschrieben habe: der erste Ausdruck ist gefrässig und sucht so viele Zeichen wie möglich, der zweite, weil er ein " zwischen "" ausschliesst, sucht nur was absolut ausreicht, um die Bedingung zu erfüllen - [^"]+ und [^"]*? in Aktion. ;)
Teste das mal genau so:
<?php
// text, der durchsucht werden soll
// nur etwas anders dargestellt
// - zwischen '' sollten die " nicht maskiert werden
// - um der Lesbarkeit des Beispiels willen in Fragmenten
$subject =
'"sonne.html"' . "\n" .
'"sonne2.html"' . "\n" .
'"sonne3.html"' . "\n" .
'"katze/sonne4.html"' . "\n" .
'"sonnehtml.jpg"' . "\n" .
'"sonne2.csv"' . "\n" .
'"sonne3.txt"' . "\n" .
'"katze/sonne4.php"';
// der reguläre ausdruck
$pattern = '!".*?atz.*?"!is';
#$pattern = '!"[^"]+atz[^"]*?"!is';
// regexp auswerten
$result = preg_match_all( $pattern, $subject, $subpattern );
// ergebnis ausgeben
echo '<p>der verwendete reguläre ausdruck trifft auf den zu durchsuchenden text '.
(($result) ? $result.' mal ' : 'nicht ').'zu.</p>';
// unterausdrücke ausgeben
echo '<pre>'.print_r($subpattern, true).'</pre>';
# -------------------------------------------
# Ergebnis für $pattern = '!".*?atz.*?"!is';
# -------------------------------------------
# der verwendete reguläre ausdruck trifft auf den zu durchsuchenden text 2 mal zu.
# Array
# (
# [0] => Array
# (
# [0] => "sonne.html"
# "sonne2.html"
# "sonne3.html"
# "katze/sonne4.html"
# [1] => "sonnehtml.jpg"
# "sonne2.csv"
# "sonne3.txt"
# "katze/sonne4.php"
# )
# )
# -------------------------------------------
# Ergebnis für $pattern = '!"[^"]+atz[^"]*?"!is';
# -------------------------------------------
# der verwendete reguläre ausdruck trifft auf den zu durchsuchenden text 2 mal zu.
# Array
# (
# [0] => Array
# (
# [0] => "katze/sonne4.html"
# [1] => "katze/sonne4.php"
# )
# )
?>
Grüsse