sök och ersätt första förekomsten av ett ord

Permalänk
Medlem

sök och ersätt första förekomsten av ett ord

Jag har denna kod:

function str_replace_count($find,$replace,$subject) { $subjectnew = $subject; for ($i=0;$i < count($find);++$i) { $pos = strpos($subjectnew,substr($find[$i],2,-2)); if ($pos !== FALSE) { $temp = substr($subjectnew,$pos,strlen(substr($find[$i],2,-2))); $temp = preg_replace($find[$i],$replace[$i],$temp); $temp2 = substr($subjectnew,$pos+strlen(substr($find[$i],2,-2))); $subjectnew = substr($subjectnew,0,$pos) . $temp . $temp2; $pos = strpos($subjectnew,substr($find[$i+1],2,-2)); } } return $subjectnew; } function myreplace($bodyinfo) { $search_for = array(); $rewrite = array(); $info = mysql_query("SELECT id,ord FROM dictionary") or exit(mysql_error()); if (mysql_num_rows($info)) { While($tabell = mysql_fetch_array($info)) { $search_for[] = "/(".addslashes($tabell["ord"]).")/"; $rewrite[] = '...$1...'; } $bodyinfo = str_replace_count($search_for, $rewrite, $bodyinfo); } return $bodyinfo; }

Men den känns ganska "tung" just nu! Någon som kan kolla om jag kan göra lite förbättringar för att göra funktionerna snabbare och bättre?

EDIT: fixade till koden lite

Permalänk
Medlem
Permalänk
Medlem

Visst, jag är öppen för alla idéer, men då jag är väldigt kass på regexp kan jag inte konstruera en sådan funktion själv. Du har inte lust att visa?

Det enda kravet jag har är att funktionen ska hitta och markera den första förekomsten av varje ord jag letar efter.

Permalänk
Medlem

Jag suger själv på regexp men:
s/zomg/z0mg/
där den första förekomsten av zomg blir z0mg ^^

Permalänk
Medlem

hmmm... behöver en bättre förklaring än så för att förstå mig på regexp hehe

Permalänk
Permalänk
Medlem

jo, men det förklarar inte det där med "s/zomg/z0mg/"... Vart stoppar jag in det?

ledsen att jag är jobbig!

Permalänk
Permalänk
Permalänk
Medlem

jo, jag har kollat på dessa sidor, men problemet är ju att jag inte ser att någon av dessa funktioner har något stopp då man bytt ut ett ord. Alla verkar köra igenom hela texten och byta ut alla ord. Eller är jag blind?

Permalänk

Det krävs en g-switch för att den skall ersätta alla förekomster. I alla fall i Perl.

Permalänk
Medlem

Isbjörnen Igor: så du menar att den förinställt bara ska ersätta den första förekomsten?

denna kod ersätter iaf alla:
$num = '4';
$string = "This string has four four four words four.";
$string = ereg_replace('four', $num, $string);

Permalänk

I Perl skulle detta bara ersätta första förekomsten, men det kan vara annorlunda i andra språk.

$string = "This string has four four four words four."; $string =~ s/four/4/;

Permalänk
Medlem

Den där koden gav ett felmeddelande då man inte hade "" om den andra strängen. Satte man dit "" fick man ett väldigt konstigt ord (ŒÐ™ŠÐËÐ) hehe. Synd att pearl inte funkade i PHP

Permalänk
Hedersmedlem

Såhär (tror att det endast ska ersätta första förekomsten):

preg_replace("/four/", "4", $string);

Håller er borta från POSIX-funktionerna (ereg_)! De är nämligen ännu segare än PCRE-funktionerna (preg_) och det sista man vill är ju att belasta servern i onödan, eller hur?

EDIT: Eller så ersätter det alla? Orkar inte prova nu...
Finns iaf ingen g-modifier.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

m0REc: ersätter fortfarande alla i hela strängen.

Permalänk
Hedersmedlem

Hmm, detta då?

preg_replace("/four/", "4", $string, 1);

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

ja, det funkade! Tyckte att jag hade kollat alla funktioner, men denna hade jag tydligen inte kollat upp! Andra funktioner hade inte en "limit" i slutat utan en "count". Tack för att du gjorde mig uppmärksam på det!

Permalänk
Hedersmedlem

Hehe, inga problem.

Inte sett att den haft ett limit-argument förut, såg det nyligen när jag kollade på PHP.net.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.