• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Bestimmten Teil vom String löschen

Status
Für weitere Antworten geschlossen.

philipp

Neues Mitglied
Hi

da mein letzter thread geschlossen wurde, weil das problem gelöst war (..) muss ich für die frage einen neuen aufmachen.

ich hab bei php.net gesucht aber keine funktion gefunden die mir einen bestimmten string so kürzt, dass mir eine beliebige anzahl von zeichen vor und nach einem bestimmten teilstring bleibt und alles andere gelöscht wird.

kann ich mir sowas basteln?
 
sowas?
PHP:
//function str_cut
//$needle   -string
//$string   -string
//$space_before   -integer
//$space_after   -integer
function str_cut($needle, $string, $space_before, $space_after) {
  //retrieving the starting position of substing needle in sting
  $pos=strpos($string, $needle);
  //if needle has been found in sting return the substring otherwise return false
  if($pos!==false) {
    //call of substr to return the selected string part (substr(string, start, length))
    return substr($string, $pos-$space_before, $space_before+strlen($needle)+$space_after);
  } else {
    //return false
    return false;
  }
}

EDIT: Fehler behoben und Quelltext kommentiert.
 
Zuletzt bearbeitet:
hab noch eine string-operation, bei der ich hilfe benötige. diese funktion endet in einer katastrophe ;) (crash)

PHP:
<?php
//Ein Searchstring wird in ein array umgewandelt und dann ein string danach durchsucht
function re_multi_eregi_replace($sep, $parts, $str) {
  $i = 0;
  while ( $part = explode($sep, $parts) ) {
    $search[$i] = $part;
    $replace[$i] = "<span style=\"color:red;\">".$part."</span>";
    $i++;				
  }
  $i = 0;
  foreach ( $search as $value ) {
    $str = str_ireplace($search[$i], $replace[$i], $str);
    $i++;
  }
  return $str;
} 

?>

aufgerufen wird sie so:

PHP:
<?php
$treffer = re_multi_eregi_replace(' ', $_POST['ktn_vts'], $row[$feld]);
?>

update1:
PHP:
<?php
//Ein Searchstring wird in ein array umgewandelt und dann ein string danach durchsucht
function re_multi_eregi_replace($sep, $parts, $str) {
$i = 0;
  while ( $part = explode($sep, $parts) ) {
    $search[$i] = $part;
    $replace[$i] = "<span style=\"color:red;\">".$part."</span>";
    $i++;
  }
  for ( $i2=0;$i2<=$i;$i++ ) {
    $str = str_ireplace($value[$i2], $value[$i2], $str);
  }
  return $str;
} 

?>
 
Zuletzt bearbeitet:
Wenn ich das richtig verstehe möchtest du mit deiner Funktion alle in $part enthaltenen Teilzeichenketten in $str ersetzen.
Wenn dem so ist finde ich deine Funktion etwas umständich...
PHP:
function re_multi_eregi_replace($asearch, $cstring) {
  foreach($asearch as $csearch) {
    $creplacement = '<span style="color:red;">'.$csearch.'</span>';
    $cstring = str_ireplace($csearch, $creplacement, $cstring);
  }
  return $cstring;
}
Aufruf
PHP:
$treffer = re_multi_eregi_replace(explode(' ', $_POST['ktn_vts']), $row[$feld]);
 
großes problem... durch das script wird mir nun zb

test in <span class="hit">test</span> ersetzt

wenn aber jemand test t eingeben würde dann kommt logischerweisse das:

<span class="hi<span class="hit">t</span>">test</span>

also: ich brauche eine function oder einen befehl, der macht, dass nur ein bestimmter teil eines strings von der funktion verändert werden darf(optimal wäre sowas

PHP:
"str_ireplace($search, $replace, str_ignore_chars($string, ('<span class="hit">','</span>')))"

)

aber wie gesagt... keinen plan obs sowas gibt, und keine idee wie ich so eine function schreiben könnte

edit:MAN wieso geht das nicht?
PHP:
<?php
function re_multi_eregi_replace($seperator, $asearch, $cstring) {
$asearch = explode($seperator, $asearch);
  foreach($asearch as $csearch) {
    $creplacement = '<span class="hit">'.$csearch.'</span>'; 
    $cstring = mb_eregi_replace($csearch, $creplacement, $cstring, $ignore );
    $ignore=$creplacement;
  }
  return $cstring;
} 
?>

er ersetzt mir trotzdem die tags
okay, das mb_eregi_replace is auch ned richtig, hab da was falsch verstanden
 
Zuletzt bearbeitet:
kannst du mir sagen, wieso ich immer mit meinem in eine endlosschleife kommen bin?
Ich glaube nicht das diese Schleife jemals ein Ende findet:
PHP:
while ( $part = explode($sep, $parts) )

großes problem...
Du willst also einen Text nach Wörtern durchsuchen und diese dann in irgendeiner Form hervorheben.
Wenn es sich um gut formatierten Text handelt (sprich nach jedem Satzzeichen folgt ein Leerzeichen), dann könntest du nach Wörtern suchen die ein vorangestelltes Leerzeichen haben. Also statt nach "t" suchst du dann nach " t". Nachteil dieser Variante ist das Teile eines Wortes nich gefunden werden.
Hier mal zum Testen:
PHP:
function re_multi_eregi_replace($asearch, $cstring) {
  foreach($asearch as $csearch) {
    $creplacement = '<span style="color:red;">'.$csearch.'</span>';
    $cstring = str_ireplace(' '.$csearch, ' '.$creplacement, $cstring);
  }
  return $cstring;
}
Die Funktion str_replace() bzw. str_ireplace() akzetiert auch ein Array als Parameter für search. Vielleicht funcktioniert es ja so das die t's in deiner Ersetzung nicht ersetzt werden.
Auch eine Variante mit preg_replace() wäre denkbar, nur sollte bei einfachen Ersetzungen immer str_replace() der Vorzug gegeben werden.
 
also ich hab nun das hier:
PHP:
<?php
function re_multi_eregi_replace($seperator, $asearch, $cstring) {
$bsearch = explode($seperator, $asearch);
  foreach($bsearch as $csearch) {
	preg_replace("/((<[^>]*)|$csearch)/ie", '"\2"=="\1"? "\1":"<span class=\"hit\">\1</span>"', $cstring);
  }
  return $cstring;
} 
?>

habs von hier:
http://www.php-faq.de/q/q-regexp-ersetzen.html

es soll alle vorkommen von csearch durch <span class="hit">csearch</span> ersetzen, aber bei wiederholtem durchlaufen alle inhalte zwischen < und > ignorieren.

das problem is, dass nix ersetzt wird....

logikfehler...und was für ein logischer
so hats auszusehen:
PHP:
<?php
function re_multi_eregi_replace($seperator, $asearch, $cstring) {
$bsearch = explode($seperator, $asearch);
$fertig = $cstring;
  foreach($bsearch as $csearch) {
	$fertig = preg_replace("/((<[^>]*)|$csearch)/ie", '"\2"=="\1"? "\1":"<span class=\"hit\">\1</span>"', $fertig);
  }
  return $fertig;
} 
?>
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
Zurück
Oben