code durch anderen code ersetzen; seo

Freakz91

Grünschnabel
Moin Leute,

ich code grade an einem Script das ein CMS (PHP-Fusion) suchmaschinenoptimiert. Es enthält:
- Titel im Link
- Variabale Titel, Descriptions und Keywords

Hier kann man sich das schonmal anschauen:
http://seo.game-land.eu/

aber nun zur Sache:

ich möchte im Script automatisch die Links ersetzen und dann mit Mod-Rewrite umleiten. Funktioniert bis jetzt auch ganz gut, das problem ist nur das man alle Links bisher im Script manuell umschreiben, was ein sehr starker aufwand ist und manche User die diesen Mod vielleicht einbauen wollen können das nicht.

Deswegen könnte ich das Script gut gebrauchen....
Das Problem ist nur, das man aus diesem Link:

http://seo.game-land.eu/articles.php?cat_id=1

den hier machen muss:

http://seo.game-land.eu/artikel_kategorie/1/test

was ja auch gut funktioniert wenn man es manuell macht...

Also das hier müsste:

PHP:
<a href='".FUSION_SELF."?cat_id=".$data['article_cat_id']."'>".$data['article_cat_name']."</a>

zu diesem umgeschrieben werden:

PHP:
<a href='artikel_kategorie/".$data['article_cat_id']."/".$data['article_cat_name']."'>".$data['article_cat_name']."</a>

Ist glaub ich eigentlich nicht so schwer ausser das jetzt die Variable Name mit drinne ist. ich hab das schon mit allen Varianten des replace probiert aber es klappt nich.

Das soll so sein das mann einfach eine Datei oder so in diese Seite includen muss und der Link wird dann automatisch umgewandelt....

Ich hoffe von euch hat jemand die Lösung;)

mfg freakz
 
Was mit spontan einfällt:
Mit Ausgabepufferung alles abfangen, reguläre Ausdrücke und die alten Links ersetzen.
Nicht wirklich performant, würde ich sagen, wird aber öfters so gemacht, wenn man Dinge kombiniert, die nicht von Haus aus zusammenpassen ;)
 
also ich habe schonmal sowas hier probiert:

PHP:
FUSION_SELF."?cat_id=".$data['article_cat_id'] =
BASEDIR."artikel/".$data['article_cat_id']."/".$data['article_cat_name'];

aber da kommt komischerweise nur sowas bei raus....
articles.php?cat_id=artikel/1/artikelname

ist ja eigentlich auch schon ganz gut nur das"articles.php?cat_id=" sollte nicht da sein...
 
Du brauchst auf jeden Fall eine Routing-Tabelle, in der beide Formen (interne und externe Schreibweise) notiert sind. Damit kannst du dann in beide Richtungen umformen.

Folgendes wäre beispielsweise möglich:
PHP:
function foo( $path, $args=array() )
{
	global $routes;
	$found = false;
	foreach( $routes as $route ) {
		if( $route[1][0] == $path ) {
			$found = true;
			break;
		}
	}
	if( !$found ) {
		return false;
	}
	$retVal = $route[0][0];
	if( !preg_match_all('/<([a-zA-Z0-9-_]+)>/', $retVal, $matches) ) {
		return false;
	}
	foreach( $matches[1] as $match ) {
		$retVal = str_replace('<'.$match.'>', isset($args[$match]) ? rawurlencode($args[$match]) : '', $retVal);
	}
	return $retVal;
}
function bar( $path )
{
	global $routes;
	$found = false;
	foreach( $routes as $route ) {
		if( $route[0][0]{0} != '<' && strpos($path, preg_replace('/<.*/', '', $route[0][0])) === 0 ) {
			if( !preg_match_all('/<([a-zA-Z-_][a-zA-Z0-9-_]*)>/', $route[0][0], $matches) ) {
				continue;
			}
			$retVal = $route[0][0];
			foreach( $matches[1] as $match ) {
				if( !isset($route[0][1][$match]) ) {
					break;
				}
				$retVal = str_replace('<'.$match.'>', '(?P<'.$match.'>'.$route[0][1][$match].')', $retVal);
			}
			if( preg_match('<^'.$retVal.'$>', $path, $match) ) {
				$found = true;
				break;
			}
		}
	}
	if( $found ) {
		$retVal = array($route[1][0]);
		foreach( $match as $key => $val ) {
			if( is_numeric($key) || !in_array($key, $route[1][1]) ) {
				continue;
			}
			$retVal[1][$key] = $val;
		}
	}
	return $retVal;
}


$routes = array(
	array(
		array(
			BASEDIR.'artikel_kategorie/<cat_id>/<cat_name>',
			array(
				'cat_id' => '[1-9][0-9]*',
				'cat_name' => '[^/]+',
			),
		),
		array(
			FUSION_SELF,
			array('cat_id'),
		),
	),
);
$args = array(
	'cat_id'   => 123,
	'cat_name' => 'foobar',
);

// Generieren eines passenden URL-Pfads
$path = foo(FUSION_SELF, $args);
echo '<a href="'.htmlspecialchars($path).'">'.htmlspecialchars($args['cat_name']).'</a>';

// Parsen des angefragten URL-Pfads
var_dump(bar($path));
Das Format der Routing-Tabelle wäre in diesem Fall aber noch stark verbesserungswürdig.
 
oh danke das funktioniert sogar..jedoch ist der alte Link auch noch und es gibt ein paar sachen die nicht definiert sind anscheinend...hier kann man sich das mal anschauen:
http://www.game-land.eu/articles.php

jedoch suche ich nach einer etwas leichteren Lösung...vllt mit ob-start...? das hatte ich schon mal fertig jedoch wird dort nicht der name berücksichtigt...

PHP:
function seofusion($buf) {

$buf = preg_replace('#viewpage\.php\?page_id=([0-9]*?)(\'|")#si',
'seite_\1.html\2', $buf);

return $buf;
}
ob_start("seofusion");

jedoch schaffe ich es nicht den preg_replace so zu verändern das er auch noch die Variable mit reinnimmt...
 
Zurück