Muszę napisać maszynkę do synonimów, która będzie działała tak, że w stringu:
$str = 'Ta książka jest naprawdę super';
odszuka wyraz "książka" i zamieni go na "{książka|podręcznik}", ale jeżeli string:
$str = 'Ta {książka|podręcznik} jest naprawdę super';
ponownie przepuszczę przez preg_replace to już nie zamieni mi wyrazu "książka", bo ten znajduje się w nawiasie klamrowym. Mam coś takiego:
function str_replace_word($needle,$replacement,$haystack){
$pattern = "/\b$needle\b/i";
$haystack = preg_replace($pattern, $replacement, $haystack); return $haystack;
}
ale brakuje jeszcze tych wykluczeń. Ma ktoś pomysł jak to poprawnie zrobić?
Rozwiązałem problem, jednak nie przy użyciu funkcji z tematu. Poniżej rozwiązanie jakby ktoś potrzebował:
function strallpos($haystack,$needle,$offset = 0){
for($i = $offset; $i<strlen($haystack); $i++){
$pos = strpos($haystack,$needle,$i); if($pos !== FALSE){
$offset = $pos;
if($offset >= $i){
$i = $offset;
$result[] = $offset;
}
}
}
return $result;
}
$keywords = array('drzewo', 'test', 'krzak'); $synonyms = array('{drzewo|drzewko|krzak}', '{test|tescik}', '{krzew}'); $text = "{test|tescik} testowo test. {krzak|krzew}, drzewo, onegdaj<br>";
$i=0;
for($i=0
, $n=sizeof($keywords); $i<$n; $i++){ $pos_arr = strallpos($text, $keywords[$i]);
$j=0;
for($j=0
, $m=sizeof($pos_arr); $j<$m; $j++){ if($text[$pos_arr[$j]-1] == '{' || $text[$pos_arr[$j]-1] == '|' || $text[$pos_arr[$j]+strlen($keywords[$i])] == '|' || $text[$pos_arr[$j]+strlen($keywords[$i])] == '}'){ $allow_change = false;
} else {
if(($pos_arr[$j] == 0
&& ($text[$pos_arr[$j]+strlen($keywords[$i])] == ' ' || $text[$pos_arr[$j]+strlen($keywords[$i])] == ',' || $text[$pos_arr[$j]+strlen($keywords[$i])] == '-' || $text[$pos_arr[$j]+strlen($keywords[$i])] == '&' || $text[$pos_arr[$j]+strlen($keywords[$i])] == '.')) || ($text[$pos_arr[$j]-1] == ' ' && ($text[$pos_arr[$j]+strlen($keywords[$i])] == ' ' || $text[$pos_arr[$j]+strlen($keywords[$i])] == ',' || $text[$pos_arr[$j]+strlen($keywords[$i])] == '-' || $text[$pos_arr[$j]+strlen($keywords[$i])] == '&' || $text[$pos_arr[$j]+strlen($keywords[$i])] == '.')) || ($text[$pos_arr[$j]-1] == ';' &&($text[$pos_arr[$j]+strlen($keywords[$i])] == ' ' || $text[$pos_arr[$j]+strlen($keywords[$i])] == ',' || $text[$pos_arr[$j]+strlen($keywords[$i])] == '-' || $text[$pos_arr[$j]+strlen($keywords[$i])] == '&' || $text[$pos_arr[$j]+strlen($keywords[$i])] == '.'))){ $allow_change = true;
} else {
$allow_change = false;
}
}
if($allow_change){
}
}
}