Seite 1 von 1

function censor_text($text)

Verfasst: 04.10.2010 09:37
von MichaelJason
Hi hat jemand von euch eine Idee wie ich vor und hinter das Suchwort (Array) ein Leerzeichen bekommen kann?
Ich möchte bestimmte Wörter durch Links ersetzen und zwar nur solche die im Texte frei stehend sind. Aus diesem Grund
möchte ich dem Suchwort ein Leerzeichen anhängen, damit er nicht auf die Idee kommt Wörter in einer
zusammenhängenden Zeichenkette auszutauschen.

Beispiel: Ich fliege heute mit einem Flugzeug nach London
Flugzeug wird durch den Link <a href="http://www.flugticket.de" titel="Flugticket">Flugzeug</a> ausgetauscht.

Wenn jemand z.B: http://www.flugzeug.de schreibt möchte ich NICHT das es ausgetauscht wird.

functions_content.php

Code: Alles auswählen

/**
* Censoring
*/
function censor_text($text)
{
	static $censors;

	// Nothing to do?
	if ($text === '')
	{
		return '';
	}

	// We moved the word censor checks in here because we call this function quite often - and then only need to do the check once
	if (!isset($censors) || !is_array($censors))
	{
		global $config, $user, $auth, $cache;

		// We check here if the user is having viewing censors disabled (and also allowed to do so).
		if (!$user->optionget('viewcensors') && $config['allow_nocensors'] && $auth->acl_get('u_chgcensors'))
		{
			$censors = array();
		}
		else
		{
			$censors = $cache->obtain_word_list();
		}
	}

	if (sizeof($censors))
	{
	  // Anhängen von leerzeichen damit die Wörter richtig ausgetauscht werden.
          $mig_word = " ". $censors['match']. " ";                                                                          // Das geht dummerweise nicht 
	  $mig_replace = " ". $censors['replace']. " ";  
	  return preg_replace($mig_word, $mig_replace, $text);
	}

	return $text;
}

Re: function censor_text($text)

Verfasst: 05.10.2010 00:24
von gn#36
Die Ausdrücke in $censors['match'] sind Reguläre Ausdrücke, die Anführungszeichen müssen "innen drin" eingefügt werden, da der Suchausdruck bei Regulären Ausdrücken noch in "Delimiter", also Begrenzungszeichen, eingeschlossen ist. Ein Beispiel für einen regulären Ausdruck wäre: "/karl-heinz-[Oo]tto/s". Gesucht wird nach karl-heinz-otto und karl-heinz-Otto, ein Leerzeichen vorne und hinten würde lediglich den Delimiter ändern (auf Leerzeichen) und würde damit nur dazu führen, dass der ursprüngliche Ausdruck auch nicht mehr gefunden werden kann, da (in obigem Beispiel) dann nach /karl-heinz-otto/s und /karl-heinz-Otto/s gesucht wird. Wenn du es an dieser Stelle ändern möchtest musst du also deine Leerzeichen innerhalb der Delimiter einfügen, also als zweites Zeichen und eine gewisse Zahl an Zeichen vor Ende des Strings. Wo genau lässt sich nur sagen wenn man weiß, wie viele "Modifier" nach dem Delimiter noch kommen (das ist oben das "s", hier gibt es noch ein paar Steuerbefehle die dort stehen können).

Ansonsten solltest du lieber direkt bei den Strings ansetzen, d.h. erst mal schauen wo die aus der DB geholt werden und dann dort die Leerzeichen einfügen. Oder direkt mit in die DB hinein, dann kannst du auch trotzdem Worte überall ersetzen lassen.