A preg_replace a tag-ban, nem csak a tag utáni szöveget törli

A preg_replace a tag-ban, nem csak a tag utáni szöveget törli
2020-12-02T12:52:36+01:00
2020-12-02T17:27:57+01:00
2022-12-06T14:50:37+01:00
tivisu
Sziasztok,
Van egy script, ami a <p> tagban lévő attributumokat törli.

$pattern = array('/(?<=p)\s+[^>]+(?=>)/is', '/(?<=span)\s+[^>]+(?=>)/is', '#(<span.*?>)(.*?)(</span>)#', '/(?<=div)\s+[^>]+(?=>)/is', '#(<div>)#', '#(</div>)#', '#(<title>)#', '#(</title>)#', '#(<em>)#', '#(</em>)#', '#(<br>)#'); $replace = array('', '', '', '', '', '', '', '', '<i>', '</i>', ''); $text_nopreg = preg_replace($pattern, $replace, $text_text);
Viszont az adatbázisba beírt szövegben van egy szöveg: AP Vojvodina... - ami így jelenik meg a visszaolvasáskor: AP>
Nem értem, hogy miért történik ez?
Előre is köszönöm segítségeteket.
T
Mutasd a teljes hozzászólást!
Hali!

Van egy script, ami a <p> tagban lévő attributumokat törli.

Nem, az általad beillesztett kód (pontosabban, az első reguláris kifejezés használata) nem a „<p> tagban lévő attributumokat törli” (többek között), hanem minden olyan szövegrészt, ami valamennyi whitespace-szel kezdődik és valamennyi nem nagyobb-jelből áll, valamint megelőzi egy 'p' betű és követi egy nagyobb-jel. Erre pedig tökéletesen ráillik az "AP Vojvodina...</p>" karaktersorozatból az aláhúzott rész, így marad "AP>".

Miért használsz előre- és visszatekintést? Miért nem csak szimplán a /<p[^>]+>/is reguláris kifejezést használod (és hasonlóan a többi tag-re is) <p> csere-szöveggel?
Továbbá, mi értelme a második reguláris-kifejezésnek, ha a harmadikkal úgyis törlöd az egész span-t?

Mutasd a teljes hozzászólást!

  • Köszönmö a választ, nos a regex még nem igazán az erősségem :) majd lassan belejövök.

    Ezen felül lenne még egy gondom, amit már írtam is, hogy a <p></p> tagokban a szöveg kezdete előtt lévő spaseket meg tabokat kellene kiiktatnom illetve a szövegben lévő dupla (esetleg tripla) spaceket.

    Előre is köszönöm.

    T
    Mutasd a teljes hozzászólást!
  • Hali!

    Ezen felül lenne még egy gondom, amit már írtam is…

    Hol/mikor írtad?

    … a <p></p> tagokban a szöveg kezdete előtt lévő spaseket meg tabokat kellene kiiktatnom illetve a szövegben lévő dupla (esetleg tripla) spaceket.

    Például:
    $pattern = ['/<(p|span)[^>]+>/is', '/<\/?(?:div|title)[^>]*>/is', '/<(\/?)em[^>]*>/is', '/<br\s*\/?>/is']; $replace = ['<$1>', '', '<$1i>', '' ]; … $newText = preg_replace_callback('/(?<=<p>).+?(?=<\/p>)/is', function($m) { return preg_replace(['/^\s+|\s+$/', '/\s{2,}/'], ['', ' '], $m[0]); }, preg_replace($pattern, $replace, $text));
    Megjegyzés: a korábbi kódodat kicsit átalakítottam és a teljes span-eket törlő részt kiszedtem, mert hibára vezethet, ha egymásba ágyazott span-ek vannak a szövegben.

    Mutasd a teljes hozzászólást!
  • A visszaolvasásnál szépen eltüntet minden felesleget, viszont a PHPWordnek úgy látszik az <a> tag is problémát okoz, ugyanis amit bemásoltam szöveget abban volt egy ilyen:
    <p><a name="_GoBack"></a> szöveg</p>
    Amikor az <a> tagokat kivettem az adatbázisban, akkor már megírta a docx filet. Tehát még ezt is el kéne tűntetnem :(
    Mutasd a teljes hozzászólást!
  • A visszaolvasásnál szépen eltüntet minden felesleget, viszont a PHPWordnek úgy látszik az <a> tag is problémát okoz, ugyanis amit bemásoltam szöveget abban volt egy ilyen:


    <p><a name="_GoBack"></a> szöveg</p>


    Amikor az <a> tagokat kivettem az adatbázisban, akkor már megírta a docx filet. Tehát még ezt is el kéne tűntetnem :(
    Mutasd a teljes hozzászólást!
  • Hali!

    Tehát még ezt is el kéne tűntetnem

    Mit értesz azalatt, hogy eltüntetni? A teljes <a> tag-et a tartalommal együtt, vagy csak magát a nyitó és záró részét (de a tartalom maradjon)?

    Mutasd a teljes hozzászólást!
  • Beírtam most az adatbázisba az <a></a> tagot, és nem fogadta el. Nem hiszem, hogy jó ötlet, hogy a tartalma is törölve legyen, mert, ha valaki egy linket (emailcimet v oldal címét) tett oda, akkor máris probléma lesz, mert eltűnik a szöveg. Szerintem az lenne a megoldás, ha maradna a két <a> tag között ami van és csak a tagok tűnnének el, vagyis nem gond, ha üres is. Azt még nem tudom, hogy esetleg space legyen a tagon belüli szöveg előtt és után. Hát... nem egyszerű...
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd