Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 12. Juni 2011 18:37

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Problem mit regex_replace bzw. replace

Kann mir jemand sagen, was an diesen regulären Ausdrücken falsch ist?

{$content|regex_replace:"/<p>[\s\t\n\r]*<\/p>/":""}
{$content|regex_replace:"/<p> *<\/p>/":""}
{$content|regex_replace:"/<p>\s*<\/p>/":""}
{$content|regex_replace:"/<p>(&nbsp;)*<\/p>/":""}

(ich will alle leeren Absätze löschen)
Irgendwie erkennt Smarty hier nichts.
Leere Absätze werden einfach weiterhin ausgegeben.

Das hier funktioniert hingegen:

{$content|regex_replace:"/<p>/":""}
{$content|regex_replace:"/<p>[\s\t\n\r]*</":""}

oder merkwürdigerweise das hier:

{$content|regex_replace:"/<p>(.*)<\/p>":""}

Aber das bringt mich nicht weiter.
Sobald ich im Suchausdruck nur nach "<p> </p>" suche, spinnt Smarty rum und liefert mir falsche Ergebnisse.
Entweder löscht er alle Paragraphen oder garkeinen.

Mit diesem hier:

{$content|replace:"<p></p>":''|replace:"<p> </p>":''|replace:"<p>&nbsp;</p>":''}

hab ich das gleiche Problem. (gibt's angeblich nicht ...)

Smarty will offenbar partout keine leeren Absätze erkennen.

Das frustiert mich gerade ungemein.
mad


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#2 12. Juni 2011 20:30

nicmare
Server-Pate
Registriert: 15. Dezember 2010
Beiträge: 1.314
Webseite

Re: Problem mit regex_replace bzw. replace

ich hasse regex! mal auf nils warten. ich glaube der ist da experte big_smile

Offline

#3 13. Juni 2011 22:07

nhaack
Server-Pate
Ort: Bonn
Registriert: 12. Dezember 2010
Beiträge: 171
Webseite

Re: Problem mit regex_replace bzw. replace

So'n richtiger regex pro bin ich ja auch nicht ... die Ausdrücke sollten grundsätzlich funktionieren. Hab's gerade mal selbst ausprobiert, mit diversen Ausdrücken, Delimitern und Modifier dran ... irgendwie will er echt nicht. In PHP laufen Sie, unter Smarty nicht ... Check's grad auch nicht... sehr mysteriös ...

Mein Sportsgeist ist jetzt aber geweckt ... big_smile

Offline

#4 13. Juni 2011 22:11

nhaack
Server-Pate
Ort: Bonn
Registriert: 12. Dezember 2010
Beiträge: 171
Webseite

Re: Problem mit regex_replace bzw. replace

hah ... so hat er's gefressen:

[== smarty ==]

{assign var=content value=$content|regex_replace:"@<p>(\s)*<\/p>@":""}

Offline

#5 13. Juni 2011 22:35

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: Problem mit regex_replace bzw. replace

Hm... nee, sorry. Bei mir nicht. Bleibt unverändert.
Was genau machen denn diese @-Zeichen?

Sobald im Suchmuster hinter dem ersten <p> ein Leerzeichen kommt, versagt er bereits.
/<p>\s*/ funktioniert. Aber dann findet er auch alle anderen Paragraphen.
/<p>\s/ funktioniert schonwieder nicht mehr. Obwohl das im Quelltext definitiv drinsteht.
Ebenso funktioniert auch das hier nicht mehr /<p>\s*<\/p>/
Als ob er ein Problem mit dem Leerzeichen hat.
Sind die Leerzeichen bei Smarty irgendwie maskiert bevor das ganze an den Browser geht? Als ASCII/UTF-8 Code oder so? Das würde erklären, warum der Browser ein Leerzeichen anzeigt, aber preg_replace keines finden kann.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#6 13. Juni 2011 23:44

nhaack
Server-Pate
Ort: Bonn
Registriert: 12. Dezember 2010
Beiträge: 171
Webseite

Re: Problem mit regex_replace bzw. replace

das @ ist einfach nur ein anderer Delimiter ... macht eigentlich nichts anderes als / oder ~ oder was auch immer ... (hoffe ich erzähle jetzt nix falsches)

Habe es wie folgt probiert:

[== html ==]

<p></p>
<p> </p>
<p>   </p>

Hat er alles rausgelöscht. Habe die leeren Absätze einfach in einen Artikel eingestreut als auch am Anfang eines Content-Blocks.
Ich bin durchgängig UTF-8.

Sind Leerzeichen denn je nach encoding anders codiert?

Bei mir hat es jedenfalls erst funktioniert, wenn ich $content explizit neu zuweise und dabei das Regex benutze. Vorher war auch zappenduster (also, wenn ich es direkt anwende).

Sehr mysteriös. Kann da die CMSMS Version, bzw. die verwendete Smartyversion etwas mit am Hut haben? Getestet auf 1.9.4.1

Offline

#7 13. Juni 2011 04:20

nicmare
Server-Pate
Registriert: 15. Dezember 2010
Beiträge: 1.314
Webseite

Re: Problem mit regex_replace bzw. replace

nhaack schrieb:

Getestet auf 1.9.4.1

funzt bei mir aber auch nicht!
1.9.4.1

Config Information:
    php_memory_limit:
    process_whole_template: false
    output_compression: false
    max_upload_size: 200000000
    default_upload_permission: 664
    url_rewriting: mod_rewrite
    page_extension: .html
    query_var: page
    image_manipulation_prog: GD
    auto_alias_content: true
    locale:
    default_encoding: utf-8
    admin_encoding: utf-8
    set_names: true

Php Information:
    phpversion: 5.3.2-nmm1
    md5_function: An (Ja)
    gd_version: 2
    tempnam_function: An (Ja)
    magic_quotes_runtime: Aus (Nein)
    E_STRICT: 0
    E_DEPRECATED: 0
    memory_limit: 64M
    max_execution_time: 60
    output_buffering: An
    safe_mode: Aus (Nein)
    file_uploads: An (Ja)
    post_max_size: 200M
    upload_max_filesize: 200M
    session_save_path: /tmp (0333)
    session_use_cookies: An (Ja)
    xml_function: An (Ja)

Server Information:
    Server Api: cgi-fcgi
    Server Db Type: MySQL (mysql)
    Server Db Version: 5.1.43

Offline

#8 13. Juni 2011 13:17

nhaack
Server-Pate
Ort: Bonn
Registriert: 12. Dezember 2010
Beiträge: 171
Webseite

Re: Problem mit regex_replace bzw. replace

höchstgradig mysterös ...

Offline

#9 13. Juni 2011 14:20

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: Problem mit regex_replace bzw. replace

Also wenn, dann würde ich eher auf die PHP Version tippen.
An der Smarty-Version hat sich bei CMSms ja nichts geändert.
(Teste mit CMSms 1.9.5 SVN und 1.9.4.2)

Habe auch mal einen Postfilter geschrieben.
Gleiches Ergebnis.

Das hier ändert nichts:

function smarty_cms_postfilter_remove_empty_paragraphs($tpl_output, &$smarty)
{
    return preg_replace('/<p>[\s\t\n\r]*<\/p>/im', '', preg_replace('/<p>(&nbsp;)*<\/p>/i', '', $tpl_output));
}

Das hier funktionert (zumindest der äußere Teil):

function smarty_cms_postfilter_remove_empty_paragraphs($tpl_output, &$smarty)
{
    return preg_replace('/<(\/?)p>/i', '<$1b>', preg_replace('/<p>(&nbsp;)*<\/p>/i', '', $tpl_output));
}

Bringt mir aber nichts, weil ich die Absätze ja nicht in <b> umwandeln will.

Hab es mit PHP 5.3.2, 5.2.13 (beides Mac) und 5.2.12-nmm2 (Linux 2.6.32-32-server - Allinkl.) getestet.
Könnte auch an der verwendeten PCRE Libary liegen.
Laut phpinfo() hab ich 8.00 2009-10-19  (PHP 5.3.2) und 7.9 2009-04-11 (PHP 5.2.*).

Ich check's nicht.

€: Lustig, ein leerer Absatz <p> </p> wird nicht ersetzt. Aber wenn ich ein Zeichen reinsetze: <p>-</p> und nach /<p>-<\/p>/ suche, dann klappt es.
Bei einem Inhaltsblock ohne WYSIWYG Editor bzw. einem Absatz im Template, klappt es.
Mit TinyMCE nicht. Was zum Teufel schreibt der TinyMCE in leere Absätze rein, was aussieht wie ein Leerzeichen aber offenbar keines ist?


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline