[php] str_replace

Pagina: 1
Acties:
  • 201 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb de volgende code:
PHP:
1
2
3
4
while($row = mysql_fetch_array($result, MYSQL_BOTH)){
 $nieuw_woord="<a class=woordenlijst href=\"JavaScript:windowOpen('woordenlijst.php?woord_id=".$row['woord_id']."','woord',500,500)\">".$row['woord']."</a>";
 $txt = str_replace($row['woord'], $nieuw_woord, ($txt));
}


die vervangt dus het oude woord in $txt voor het nieuwe woord,
echter, hij moet alleen woorden uit de platte tekst wijzigen, en niet woorden of letters in de eerder gevormde links. eigenlijk moet hij dus alleen naar tekst kijken die niet tussen < .. > staat, ik kan dit alleen niet vinden en vraag me af of ik niet met preg_replace oid moet werken

Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 21:12

Tux

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 21:31

Gonadan

Admin Beeld & Geluid, Harde Waren
Dan is het misschien handig om als truukje alleen te kijken naar tekst tussen > en < :)
Dat kan je in je regex gewoon opgeven. :)

Maar het is natuurlijk netter om een goede match te schrijven. :)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Je wil dus alleen de tekst van de url veranderen ? (sorry heb je text 3 keer gelezen).

Waarom doe je dan niet eerst de replace en maak je dan $nieuw_woord ?

[edit]
Ahh, ik snap het :)

[ Voor 9% gewijzigd door Verwijderd op 20-06-2006 10:48 ]


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 21:31

Gonadan

Admin Beeld & Geluid, Harde Waren
Verwijderd schreef op dinsdag 20 juni 2006 @ 10:42:
Je wil dus alleen de tekst van de url veranderen ? (sorry heb je text 3 keer gelezen).

Waarom doe je dan niet eerst de replace en maak je dan $nieuw_woord ?
Hij wil in de tekst ($txt) alle woorden die in de set voorkomen vervangen door een link. :)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik wil dus alle woorden in $txt vervangen voor een link, dan krjig je iets van

$txt="blaat allemaal shit <a>link</a>";

daarna moet hij dus niet als ik bijvoorbeeld een 'i' vervang ook de 'i' in link gaan vervangen, hij moet dus overal kijken behalve tussen < en >

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gonadan schreef op dinsdag 20 juni 2006 @ 10:41:
Dan is het misschien handig om als truukje alleen te kijken naar tekst tussen > en < :)
Dat kan je in je regex gewoon opgeven. :)

Maar het is natuurlijk netter om een goede match te schrijven. :)
dat kan niet omdat er niet altijd sprake is van > en < helaas..

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 21:31

Gonadan

Admin Beeld & Geluid, Harde Waren
Verwijderd schreef op dinsdag 20 juni 2006 @ 10:48:
[...]

dat kan niet omdat er niet altijd sprake is van > en < helaas..
Als je de html goed opbouwt wel.
Dan heb je minstens <body> en </body> ;)
Maar dat is natuurlijk een hele ranzige oplossing. :P

[ Voor 15% gewijzigd door Gonadan op 20-06-2006 10:53 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Je zou eens kunnen kijken hoe ze dat doen bij 'content advertising' of 'bad words removal' scripts.

Je zou een array kunnnen maken met de woorden die je wil vervangen en dan woord voor woord door de tekst lopen en kijken of je ze moet vervangen voor die link.

[ Voor 6% gewijzigd door Verwijderd op 20-06-2006 10:55 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 20 juni 2006 @ 10:54:
Je zou eens kunnen kijken hoe ze dat doen bij 'content advertising' of 'bad words removal' scripts.

Je zou een array kunnnen maken met de woorden die je wil vervangen en dan woord voor woord door de tekst lopen en kijken of je ze moet vervangen voor die link.
dit doe ik dus al, punt is dat hij alleen moet kijken in de platte tekst en niet in html code die tussen de code door staat, odtewel overal behalve tussen < en >
Verwijderd schreef op dinsdag 20 juni 2006 @ 10:54:
Je zou eens kunnen kijken hoe ze dat doen bij 'content advertising' of 'bad words removal' scripts.

Je zou een array kunnnen maken met de woorden die je wil vervangen en dan woord voor woord door de tekst lopen en kijken of je ze moet vervangen voor die link.
nee want dit is slechts de inhoud van een stukje pagina, niet de gehele pagina. er valt dus niet te voorspellen of dit het geval is of niet

[ Voor 35% gewijzigd door Verwijderd op 20-06-2006 10:57 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Lief dat je me 2 keer quote :)

Waarom zou dit niet werken ? Je pakt gewoon het stukje tekst wat je wil doorzoeken en je doet zoiets:

PHP:
1
2
3
4
5
6
7
8
9
10
$text = "dit is een hele lange zin of tekst met veel letterjes";
$wordlist = array('is', 'lange', 'dit');
$word = getFirstWord($text);
while(!empty($word))
{
    if(in_array($word, $wordlist)) {
        ReplaceWord(bla bla bla bla)    
    }
    $word = getNextWord($text);
}


Je moet dan in je 'getFirst/NextWord' alleen even de HTML er uit halen.

Dit lijkt mij sneller werken dan bij elke keer de hele tekst te doorzoeken met str_replace of 1 of andere regex functie maar dat zou je natuurlijk een keer kunnen timen.

[ Voor 65% gewijzigd door Verwijderd op 20-06-2006 11:10 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 20 juni 2006 @ 11:01:
Lief dat je me 2 keer quote :)

Waarom zou dit niet werken ? Je pakt gewoon het stukje tekst wat je wil doorzoeken en je doet zoiets:

PHP:
1
2
3
4
5
6
7
8
9
10
$text = "dit is een hele lange zin of tekst met veel letterjes";
$wordlist = array('is', 'lange', 'dit');
$word = getFirstWord($text);
while(!empty($word))
{
    if(in_array($word, $wordlist)) {
        ReplaceWord(bla bla bla bla)    
    }
    $word = getNextWord($text);
}


Je moet dan in je 'getFirst/NextWord' alleen even de HTML er uit halen.

Dit lijkt mij sneller werken dan bij elke keer de hele tekst te doorzoeken met str_replace of 1 of andere regex functie maar dat zou je natuurlijk een keer kunnen timen.
en hoe zorg ik er nu dan voor dat hij ook niet in de html kijkt?
volgens mij mis ik iets want zoals ik nu tegen je oplossing aankijk,
als ik in mijn woordenlijst zet dat hij iedere 'e' moet vervangen dan doet hij dat toch ook nog in <a href ..

of begrijp ik je niet?

OF bedoel je dat je woord voor woord doorloopt in $txt, per woord de hele lijst langsgaat om te kijken of hij vervangen moet worden, zo ja meteen naar volgende woord, zo nee verder gaan met check tot hij (n)iets, en dan door gaat naar het volgende woord, zodat ieder woord maar 1 keer in bod komt?

[ Voor 31% gewijzigd door Verwijderd op 20-06-2006 11:21 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik zal proberen nu een voorbeeldje te maken maar ik heb helaas niet zo veel tijd.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$words=explode(" ",$txt);
        $new_words=array();
        $nieuw_woord="";    
        foreach($words as $oud_woord){
            $result = mysql_query("SELECT woord_id, woord FROM woordenlijst");
            while($row = mysql_fetch_array($result, MYSQL_BOTH)){
                if($row['woord']==$oud_woord){
                    $nieuw_woord="<a class=woordenlijst href=\"JavaScript:windowOpen('woordenlijst.php?woord_id=".$row['woord_id']."','woord',500,500)\">".$row['woord']."</a>";
                }
                else{
                    $nieuw_woord=$oud_woord;
                }           
            }
            array_push($new_words, $nieuw_woord);   
            $nieuw_woord="";    
        }
        $txt=implode(" ", $new_words);


ik heb nu dit, alleen dit werkt niet volledig.
hij werkt namelijk niet voor alle waarden die voortkomen uit de query maar het lukt mij niet om het op te lossen. hij doet het dus alleen met de laatste loop die uit de query komt de rest slaat hij niet op

CORRECTIE:
hij pakt alleen de eerste waarde uit $row
hierdoor vervangt hij alleen het laatste ingevoerde woord ipv alle worden uit de db

[ Voor 18% gewijzigd door Verwijderd op 20-06-2006 12:36 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Volgens mij de "array_push($new_words, $nieuw_woord);" instructie 1 regeltje hoger zetten en je bent er ?

Acties:
  • 0 Henk 'm!

Verwijderd

Ben bijna klaar met mijn voorbeeld. 10min.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
stom ik heb het al ik moet natuurlijk wel controlleren of hij al een woord vervangen heeft... dit is het geworden:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$words=explode(" ",$txt);
        $new_words=array();
        $nieuw_woord="";    
        foreach($words as $oud_woord){
            $controle=0;
            $result = mysql_query("SELECT woord_id, woord FROM woordenlijst");
            while($row = mysql_fetch_array($result, MYSQL_BOTH)){
                if($controle==0){
                    if($row['woord']==$oud_woord){
                        $nieuw_woord="<b>".$oud_woord."</b>";
                        $controle=1;
                    }
                    else{
                        $nieuw_woord=$oud_woord;
                    }
                }           
            }
            array_push($new_words, $nieuw_woord);   
            $nieuw_woord="";    
        }
        echo $a."<br>";
        $txt=implode(" ", $new_words);

de txt wordt gesplitst op spaties,
vervolgens wordt bij ieder element gekeken of hij in de databse zit, zoja dan wordt hij vervangen, zo nee dan wordt het weer het oude woord,
het niewe woord wordt achteraan in de array geplaatst en uiteindelijk wordt de array weer samengevoegd.


ik ben benieuwd naar je voorbeeld, kijken of we een beetje iets gelijks hebben!


nou is er 1 probleem, als een woord aan het begin van de zin staat dan werkt hij niet, als hij in het midden staat werkt hij wel weer
iemand een idee?
oplossing:

PHP:
1
$txt = str_replace("\n", "<br> ", $txt);

spatie achter <br >

nu zit ik alleen nog met punten en komma's....

[ Voor 69% gewijzigd door Verwijderd op 20-06-2006 13:34 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb geen tijd om er verder aan te werken maar aangezien het al aardig werkt zet ik het hier maar neer. Waar je nog rekening mee moet houden zijn bv. leestekens en alle bugs die er nog in zitten.

Owja ik heb <> vervangen voor [] zodat het wat makkelijker debuggen is.

Nu is het wachten op de persoon die het met een paar regex'jes kan vervangen ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?

$text = '"Use the fucking search". Used on forums[bold] where certain [a href=forums.php]participants[/a] are too [b]lazy[/b] to use the search function to find what they need and so they open a new, unnecessary, topic.'; 
echo $text.'<br />';
$wordlist = array('forums', 'lazy');
$wt = new WordTraveler();
$wt->setText($text);
$word = $wt->getFirstWord();
echo '['.$word.']<Br />';
while($word != '')
{   
    if(in_array($word, $wordlist)) 
    {
        $wt->ReplaceWord($word, '[a href="link.html"]'.$word.'[/a]');
    }
    $word = $wt->getNextWord(); 
    echo '['.$word.']<Br />';
}
echo '<hr />'.$wt->getText().'<hr />';
exit;

class WordTraveler
{
    var $m_text;
    var $m_replace_offset;
    var $m_offset;
    
    function getFirstWord()
    {
        $this->m_offset = 0;
        $this->m_replace_offset = 0;
        return $this->getNextWord();            
    }
    
    function getNextWord()
    {
        // Vars
        $word = '';
        
        // Eet spaties
        while(substr($this->m_text, $this->m_offset, 1) == ' ') {
            $this->m_offset++;
            if($this->m_offset > strlen($this->m_text)) {
                return '';
            }
        }
        
        // Bewaar de huidige offset zodat we weten waar
        // er een woord moet worden vervangen
        $this->m_replace_offset = $this->m_offset;
        
        // Zoek de volgende spatie in de zin            
        $new_offset = strpos($this->m_text, ' ', $this->m_offset);
        
        // Eet html
        $html_start_offset = strpos($this->m_text, '[', $this->m_offset);       
        while(false !== $html_start_offset && $html_start_offset < $new_offset)
        {
            // En een > binnen 255 tekens ?  <tussen_max_255_chars> 
            $html_end_offset = strpos($this->m_text, ']', $html_start_offset);          
            if(false !== $html_end_offset && ($html_end_offset-$html_start_offset < 255))
            {               
                // Text er voor 'later ditiseenzin[bold] nog'               
                $word = substr($this->m_text, $this->m_offset, $html_start_offset-$this->m_offset);
                if($word != '')             
                {           
                    $this->m_offset = $html_end_offset+1;       
                    return $word;
                }               
                
                // Los van andere woorden? 'later [bold] nog'
                $this->m_offset = $html_end_offset+1;
                while(substr($this->m_text, $this->m_offset, 1) == ' ') {
                    $this->m_offset++;
                    if($this->m_offset > strlen($this->m_text)) {
                        return '';
                    }
                }   
                $this->m_replace_offset = $this->m_offset;          
            }
            
            // Volgende spatie en [
            $new_offset        = strpos($this->m_text, ' ', $this->m_offset);
            $html_start_offset = strpos($this->m_text, '[', $this->m_offset);
        }
                
        // Als er geen spate is gevonden dan zijn we vermoedelijk aan het einde van de zin
        if(false !== $new_offset)
        {
            // Spatie gevonden
            $word = substr($this->m_text, $this->m_offset, $new_offset-$this->m_offset);    
            $this->m_offset = $new_offset+1;                        
        }
        else
        {           
            // Laatste woord in de zin
            $word = substr($this->m_text, $this->m_offset); 
            $this->m_offset = strlen($this->m_text);
        }
        return $word;   
    }
    
    function ReplaceWord($match, $repace)
    {
        // Brakke replace :)
        $this->m_text   = substr($this->m_text,0,$this->m_replace_offset).$repace.substr($this->m_text,$this->m_replace_offset+strlen($match));
        $this->m_offset = $this->m_offset + (strlen($repace) - strlen($match));
    }
    
    function setText($text)
    {
        $this->m_text = $text;
    }
    
    function getText()
    {
        return $this->m_text;
    }
}

?>

[ Voor 21% gewijzigd door Verwijderd op 20-06-2006 14:21 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op dinsdag 20 juni 2006 @ 13:06:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$words=explode(" ",$txt);
        $new_words=array();
        $nieuw_woord="";    
        foreach($words as $oud_woord){
            $controle=0;
            $result = mysql_query("SELECT woord_id, woord FROM woordenlijst");
            while($row = mysql_fetch_array($result, MYSQL_BOTH)){
                if($controle==0){
                    if($row['woord']==$oud_woord){
                        $nieuw_woord="<b>".$oud_woord."</b>";
                        $controle=1;
                    }
                    else{
                        $nieuw_woord=$oud_woord;
                    }
                }           
            }
            array_push($new_words, $nieuw_woord);   
            $nieuw_woord="";    
        }
        echo $a."<br>";
        $txt=implode(" ", $new_words);
Dit is echt geen goed plan om meerdere redenen.

1. Geen html filter (daar ging het toch om ?)

2. Je gaat voor elk woord de hele database doorzoeken (TRAAG), je zou het kunnen vervangen voor 'select word_id from table where word="insertword"'; maar dan zoek je nog meerdere malen voor de zelfde woorden.

etc.

[ Voor 32% gewijzigd door Verwijderd op 20-06-2006 14:48 ]


Acties:
  • 0 Henk 'm!

  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
PHP:
1
2
        // Zoek de volgende spatie in de zin            
        $new_offset = strpos($this->m_text, ' ', $this->m_offset);
Als je dit zoeken naar spaties vervangt door een regexp die ook op ', ' en '. ' reageert ben je er volgens mij.

Acties:
  • 0 Henk 'm!

Verwijderd

moozzuzz schreef op dinsdag 20 juni 2006 @ 20:51:
PHP:
1
2
        // Zoek de volgende spatie in de zin            
        $new_offset = strpos($this->m_text, ' ', $this->m_offset);
Als je dit zoeken naar spaties vervangt door een regexp die ook op ', ' en '. ' reageert ben je er volgens mij.
Dat is idd een handige uitbreiding zodat woorden die perongeluk aan elkaar zitten ook gesplitst worden.

bv: 'dit is een zin,waar een komma en een punt inzitten.';

In mijn scripje hierboven zal 'zin,waar' als 1 woord gezien worden (very bad :P).

Je zou eventueel later de interpunctie ook weg kunnen halen doormiddel van de volgende regex:

PHP:
1
2
3
$m_punctuation = "/\s|:|;|&|,|'|\.|\?|@|!/";
$text = 'Dit is:een voorbeeld, maar ook.';
$text = preg_replace($m_punctuation, ' ', $text);

[ Voor 8% gewijzigd door Verwijderd op 20-06-2006 23:06 ]

Pagina: 1