php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 12.05.2005, 13:31  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard [REGEXP] Suchbegriffe ersetzen - Problem mit Satzzeichen

Hi,
ich habe folgendes Problemchen .. ich möchte bestimmte Wörter in einem Text ersetzen. Jo, irgendwie komme ich nicht dahinter, wie ich das geschickt mit einem regulären Ausdruck machen kann.

Selbstverständlich kenne ich die entsprechenden PHP-Funktionen, allerdings besteht folgendes Problem:
1. Ich bin nicht wirklich fit in Sachen RegExps, was natürlich nicht so bleiben soll
2. Wenn ich ein Wort habe, z.B. "Mutter", dann möchte ich natürlich nicht, dass das "Muttersöhnchen" angefasst wird.

Groß- und Kleinschreibung ist eigentlich irrelevant, weil ich die Wörter selbst schreibe und die zu ersetzenden auch selbst definiere. Ich achte dabei sowieso auf die richtige Rechtschreibung.

Ich habe schon diesen Thread hier gefunden.
http://phpfriend.de/forum/viewtopic.php?t=28956; aber das ist auch nicht das, was ich haben möchte ...
Warum?

Ich habe mal Testwörter erstellt:
"HTML", "PHP" und "z.B."

Die ersten beiden werden richtig umgewandelt ... aber das "z.B." wird nicht ersetzt. Ich denke mir, dass das an den Punkten liegt .. ? Stimmt das?
Wenn ja .. wie kann ich das denn so abändern, dass mir der Code auch Suchbegriffe dieser Art ersetzt?

Danke für Eure Hilfe.

Grüße Ben.
imported_Ben ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 12.05.2005, 13:34  
Gast
 
Beiträge: n/a
Standard

Wie sieht denn Dein regulärer Ausdruck aus?
Und wie Deine Testdaten?
Welches Ergebnis ist gewünscht und welches erhälst Du?
 
Alt 12.05.2005, 13:39  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

der punkt ist ein sonderzeichen bei regulären ausdrücken, den du mit einem backslash "\" escapen musst.

PHP-Code:
<?php
$regex 
'#\s(z\.B\.)\s#i';
?>
das '\s' bezeichnet ein whitespace-zeichen, leerzeichen, tab etc...

aber:
warum nicht str_ireplace() ?
axo ist offline  
Alt 12.05.2005, 13:40  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Äh.
Nunja, wie ich schon sagte:
PHP-Code:
<?php

    $pattern 
sprintf ('/\b%s\b/i'$objAbbr->_abbreviation);
    
$replace sprintf($tag$objAbbr->_description,   $objAbbr->_abbreviation);
    
$content preg_replace($pattern$replace$content); 

?>
$replace wird mittels einer Methode gefüllt, die hier jetzt mal irrelevant ist. Da steht das richtige drin.

Meine Testdaten
Code:
$var = 'Hallo, das hier z.B. ist ein Text php! PHP. 
     		             		     HTML, PHP und es testPHP, dass ... ';
Wobei die Wörter PHP, HTML und die Abkürzung z.B. ersetzt werden sollen .. von mir aus erst mal durch ein <span style="color:red;">%s</span>.

Das ist mir zunächst einmal egal, da dort nicht das Problem liegt.

Welches Ergebnis ist gewünscht ..
Zitat:
Zitat von Ben
Wenn ich ein Wort habe, z.B. "Mutter", dann möchte ich natürlich nicht, dass das "Muttersöhnchen" angefasst wird.
[..]
Die ersten beiden werden richtig umgewandelt ... aber das "z.B." wird nicht ersetzt. Ich denke mir, dass das an den Punkten liegt .. ? Stimmt das?
Grüße Ben.


edit:
@axo:
Kurz testen ...
imported_Ben ist offline  
Alt 12.05.2005, 13:42  
Gast
 
Beiträge: n/a
Standard

Ein Punkt ist auch ein \W, also wird zwischen B und . getrennt.
Aber \s deckt leider keine Satzzeichen ab, wenigstens die sollten noch per [] aufgenommen werden.


Ansonsten erleichert http://php.net/preg_quote die Arbeit oft: z.B. ->z\.B\.


PHP-Code:
<?php

$text 
'.';
$pattern '!\W!';
if ( 
preg_match($pattern$text$m) ) 
    echo 
'\W passt auf: '$m[0];

echo 
"\n
\n"
;
// und weil das so ist
// und \b immer zwischen \w und \W 'passt'
// wird B. durch \b getrennt
$text 'B.';
$pattern '!B\b!';
$replace '#';
echo 
preg_replace($pattern$replace$text);
?>
 
Alt 12.05.2005, 13:52  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ich hab's mal unkommentiert gelassen...

[edit]
und weil preg_quote eine sehr gute idee ist, gleich mit eingefügt.
[/edit]

PHP-Code:
<?php
$var 
'Hallo, das hier z.B. ist ein Text php! PHP.
                                   [b]HTML[/b], PHP und es testPHP, [i]dass[/i] ... '
;

function 
ersetze($teilString,&$original) {
    
$trennZeichen '[\]\s\.!]';
        
$teilString preg_quote($teilString,'#');
    return 
preg_replace('#('.$trennZeichen.')('.$teilString.')('.$trennZeichen.')#i','\\1<span style="color:red">\\2</span>\\3',$original);
}
echo 
'original: ' $var "\n";
echo 
'replacing php: ' ersetze('php',$var) . "\n";
echo 
'replacing PHP: ' ersetze('PHP',$var) . "\n";
echo 
'replacing HTML: ' .ersetze('HTML',$var) . "\n";
echo 
'replacing z.B.: ' .ersetze('z.B.',$var) . "\n";
?>
axo ist offline  
Alt 12.05.2005, 13:52  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Okay. Das verstehe ich ja. Aber irgendwie weiß ich jetzt nicht, wie ich das denn in meinen String einbaue, da ich dort ja nicht explizit "z.B." stehen habe, sondern
Code:
 $objAbbr->_abbreviation
Versteht Ihr wo mein Problem liegt?

@Volker:
Bzgl. preq_quote() ... wende ich das auf das erstellte Pattern an oder auf meine Variable? Ich habe jetzt beides getestet, aber so wirklich will das nicht ..
imported_Ben ist offline  
Alt 12.05.2005, 13:57  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

also allgemein ist ja bis jetzt #\s(z\.B\.)\s#i vorhanden soweit ich das sehe, damit bekomsmte schonmal alle Wörter die irgendwo frei rumstehen was man noch schauen muss wäre jetzt das ende eines satzes sprich mit . dahinter, dann komma trennung, klammern etc, vom ansatz her käme ich damit erstmal auf folgendes:

[\s,&\[\(\{\"\'](%s)[\s,\.!&\]\)\}\"\']

also das wäre so mein ansatz für den anfang
robo47 ist offline  
Alt 12.05.2005, 14:03  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Zitat:
Zitat von Ben
Okay. Das verstehe ich ja. Aber irgendwie weiß ich jetzt nicht, wie ich das denn in meinen String einbaue, da ich dort ja nicht explizit "z.B." stehen habe, sondern
Code:
 $objAbbr->_abbreviation
Versteht Ihr wo mein Problem liegt?

@Volker:
Bzgl. preq_quote() ... wende ich das auf das erstellte Pattern an oder auf meine Variable? Ich habe jetzt beides getestet, aber so wirklich will das nicht ..
so ?
PHP-Code:
<?php
 $pattern 
sprintf ('/\b%s\b/i'preq_quote($objAbbr->_abbreviation));
    
$replace sprintf($tag$objAbbr->_description,   $objAbbr->_abbreviation);
    
$content preg_replace($pattern$replace$content);

?>
robo47 ist offline  
Alt 12.05.2005, 14:40  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Also. Ich habe jetzt mal versucht das Beispiel von axo nachzuvollziehen.
Letztendlich habe ich nun diesen Code hier:
PHP-Code:
<?php

             $arrAbbreviations 
= array();
             
// [..] Array füllen             

             
$delimiter '[\[\]\s\.!,]' ;
             
             foreach(
$arrAbbreviations as $objAbbr) {
                 if(
$tag $this->getAbbreviationTag($objAbbr)) {
                                          
                    
$content preg_replace('#(' $delimiter ')(' $objAbbr->_abbreviation .')(' $delimiter ')#i',
                                            
'\\1' sprintf($tag$objAbbr->_description$objAbbr->_abbreviation) . ' \\3',
                                            
$content);                                                                                                                
                 }
                 
             }    
             
             return 
$content;                 
        }
        
        private function 
getAbbreviationTag($objAbbr) {
            if(
$objAbbr->_tag == 'abbr') {
                return 
'<abbr title="%s">%s</abbr>';
            }
            elseif(
$objAbbr->_tag == 'acronym') {
                return 
'<acronym title="%s">%s</acronym>';
            }

            return 
false;
        }
Es ist nun so, dass ich bei folgendem Testtext.
Code:
Hallo, das hier z.B. ist ein Text. PHP. php! 
     		             		     HTML, PHP und es testPHP, dass er einen...
diese Ausgabe erhalte:
Zitat:
Hallo, das hier z.B. ist ein Text PHP . PHP !
HTML, PHP und es testPHP, dass er einen
Man achte darauf, dass das mit BBCode behandelte HTML nicht "unterstrichen" wird und hinter den beiden "PHPs" eine Leerzeile eingefügt wird. ..

Irgendwie .. komm ich da noch nicht ganz zu Potte.

Danke weiterhin für Eure Bemühungen.

Grüße Ben.
imported_Ben ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Dynamisches Array - Problem mit Ersetzen von einz. Werten Micro PHP Tipps 2008 10 29.01.2008 11:12
MATCH .... AGAINST ... Problem Denise Datenbanken 4 21.03.2007 20:05
Leerzeichen ersetzen Problem bei dateien mokus PHP Tipps 2006 20 24.05.2006 19:51
MySql: Suchen und ersetzen Problem faragerri Datenbanken 5 02.03.2006 15:20
Problem mit der preg_replace - Ersetzen einer Zeichenkette reimondo PHP Tipps 2006 10 07.02.2006 22:36
Problem: Zeichen in ganzer Tabelle ersetzen Datenbanken 1 03.12.2005 21:21
suchen und ersetzen - Problem bei ähnlichen Wörtern. PHP-Fortgeschrittene 6 24.01.2005 14:54
Satzzeichen Problem PHP Tipps 2004-2 2 07.11.2004 19:00
[Erledigt] includ. Text ersetzen ohne vars PHP Tipps 2004 3 13.09.2004 23:16

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
regex satzzeichen, java regex satzzeichen, http://www.php.de/php-tipps-2005/22896-regexp-suchbegriffe-ersetzen-problem-mit-satzzeichen.html, regex suchbegriff, regex replace mehrere begriffe, perl regex satzzeichen, regex nachfolgendes zeichen filtern, preg_replace zeichen ausser punkt ersetzen, php regex satzzeichen, regexp satzzeichen, ersetzen wort mit satzzeichen, satzzeichen suchen und ersetzen perl, preg replace mehrere suchworte, php ersetzen probleme, 1,$ s ersetzungen problem mit punkt, suchbegriff regex, php regular expression interpunktion, regex php probleme mit satzzeichen, regex interpunktion php, satzzeichen regexp

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




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.