Regex zu gierig

camelmed

Grünschnabel
Hallo,

hab da ein "kleines" Prob mit RegEx. Soll aus einer Tabelle einzelne Zeilen die einen gewissen Text enthalten rausfiltern. Hab nach einigen tests den richtigen pattern gefunden allerdings werden alle Zeilen bis zu der übereinstimmenden gelöscht und nicht nur die die übereinstimmt. Was mach ich da falsch?

Beispiel, wenn ich folgendes mache:

Code:
$str ='<table border="0" cellspacing="0" cellpadding="0" width="689">
    <tr>
        <td width="40%" style="text-align: center;">Blindtext mit Zahlen 1-1-1</td>
        <td width="12%" style="text-align: center;">ABC00001</td>
        <td width="12%" style="text-align: center;"><table border="0" width="70">
            <tr>
                <td style="text-align: right; line-height: 10px" width="45">99,14</td><td width="25" style="line-height: 10px;">EUR</td>
            </tr>
            </table></td>
        <td width="12%" style="text-align: center;">Blindtext mit Zahlen 1-2-1</td>
        <td width="12%" style="text-align: center;">Blindtext mit Zahlen 1-3-1</td>
    </tr>
    <tr>
        <td width="40%" style="text-align: center;">Blindtext mit Zahlen 2-1-2</td>
        <td width="12%" style="text-align: center;">ABC00002</td>
        <td width="12%" style="text-align: center;"><table border="0" width="70">
            <tr>
                <td style="text-align: right; line-height: 10px" width="45">99,99</td><td width="25" style="line-height: 10px;">ABC</td>
            </tr>
            </table></td>
        <td width="12%" style="text-align: center;">Blindtext mit Zahlen 2-2-2</td>
        <td width="12%" style="text-align: center;">Blindtext mit Zahlen 2-3-2</td>
    </tr>
    <tr>
        <td width="40%" style="text-align: center;">Blindtext mit Zahlen 3-1-3</td>
        <td width="12%" style="text-align: center;">ABC00003</td>
        <td width="12%" style="text-align: center;"><table border="0" width="70">
            <tr>
                <td style="text-align: right; line-height: 10px" width="45">99,99</td><td width="25" style="line-height: 10px;">ABC</td>
            </tr>
            </table></td>
        <td width="12%" style="text-align: center;">Blindtext mit Zahlen 3-2-3</td>
        <td width="12%" style="text-align: center;">Blindtext mit Zahlen 3-3-3</td>
    </tr>
</table>';


$pattern ='@<tr[^>]*?>[\s]+<td[^>]*?>(.*?)</td>[\s]+<td[^>]*?>(ABC00002)</td>[\s]+<td[^>]*?><table[^>]*?>[\s]+<tr[^>]*?>[\s]+<td[^>]*?>(.*?)</td><td[^>]*?>(.*?)</td>+[\s]+</tr>[\s]+</table></td>[\s]+<td[^>]*?>(.*?)</td>[\s]+<td[^>]*?>(.*?)</td>[\s]+</tr>@si';
$ersatz= '';

$str_neu = preg_replace($pattern, $ersatz, $str);

echo $str_neu;

bekomme ich:

Code:
<table border="0" cellspacing="0" cellpadding="0" width="689">
    
    <tr>
        <td width="40%" style="text-align: center;">Blindtext mit Zahlen 3-1-3</td>
        <td width="12%" style="text-align: center;">ABC00003</td>
        <td width="12%" style="text-align: center;"><table border="0" width="70">
            <tr>
                <td style="text-align: right; line-height: 10px" width="45">99,99</td><td width="25" style="line-height: 10px;">ABC</td>

            </tr>
            </table></td>
        <td width="12%" style="text-align: center;">Blindtext mit Zahlen 3-2-3</td>
        <td width="12%" style="text-align: center;">Blindtext mit Zahlen 3-3-3</td>
    </tr>
</table>

Wie bekomm ich es nun hin das nur die Zeile mit dem Fund ersetzt wird und nicht alle Zeilen bis inkl Fund?
 
Juhuu hab die Lösung ^^

hab einfach
Code:
<td[^>]*?>(.*?)</td>
in
Code:
<td[^>]*?>([^>]*?)</td>
geändert, somit is es nicht mehr soo gierig :)


EDIT:

Funktioniert nur bedingt, sobald ein HTML Tag im TD steht gehts nimmer :(
 
Zuletzt bearbeitet:
Zurück