長いけどこんなのは?
HSP開発Wikiから引っ張ってきました。
// 置換モジュール (HSP開発Wiki) 2007/06/05 ver1.3
#module modReplace
#const FIRST_SIZE 64000 // はじめに確保するsResultの長さ
#const EXPAND_SIZE 32000 // memexpand命令で拡張する長さの単位
// メモリ再確保の判断及び実行のための命令(モジュール内部で使用)
#deffunc _expand var sTarget, var iNowSize, int iIndex, int iPlusSize
if (iNowSize <= iIndex + iPlusSize) {
iNowSize += EXPAND_SIZE * (1 + iPlusSize / EXPAND_SIZE)
memexpand sTarget, iNowSize
}
return
// 文字列内の対象文字列全てを置換する命令
#deffunc replace var sTarget, str sBefore, str sAfter, local sResult, local iIndex, local iIns, \
local iStat, local iTargetLen, local iAfterLen, local iBeforeLen, local iNowSize
sdim sResult, FIRST_SIZE
iTargetLen = strlen(sTarget)
iAfterLen = strlen(sAfter)
iBeforeLen = strlen(sBefore)
iNowSize = FIRST_SIZE
iStat = 0
iIndex = 0
repeat iTargetLen // 検索・置換の開始
iIns = instr(sTarget, cnt, sBefore)
if (iIns < 0) { // もう見つからないので、まだsResultに追加していない分を追加してbreak
_expand sResult, iNowSize, iIndex, iTargetLen - cnt // オーバーフローを避けるため、メモリを再確保
poke sResult, iIndex, strmid(sTarget, cnt, iTargetLen - cnt)
iIndex += iTargetLen - cnt
break
} else { // 見つかったので、置換して続行
_expand sResult, iNowSize, iIndex, iIns + iAfterLen // オーバーフローを避けるため、メモリを再確保
poke sResult, iIndex, strmid(sTarget, cnt, iIns) + sAfter
iIndex += iIns + iAfterLen
iStat++
continue cnt + iIns + iBeforeLen
}
loop
sdim sTarget, iIndex + 1
memcpy sTarget, sResult, iIndex
return iStat // おまけ。置換した個数をシステム変数statに代入。
#global
a="俺様はガキ大将!\n俺様はジャイ○ンでぃ!!\n俺様は・・・"
b=""
chk="俺様"//変換元
cov="僕"//変換後
mesbox a,320,400,1
pos 320,0
mesbox b,320,400,0
button "GO!",*go
stop
*go
replace a, chk, cov
objprm 1,a