Links/Werbelinks ersetzen

  • Themenstarter Themenstarter Egon
  • Beginndatum Beginndatum
E

Egon

Hallo PHP Gemeinde,
ich habe folgendes Problem und zwar möchte ich, wenn ein User im meinem Forum z.B. http://www.ebay.de schreibt dies mit "Keine Werbung" ersetz wird. Also ich verwende jetzt http://www.ebay.de als Beispiel, da ich hier ja keine Werbelinks posten darf^^ Mein Script sieht also so aus:

<?php
$suchmuster = array();
$suchmuster[0] = '/ebay.de/';

$ersetzungen = array();
$ersetzungen[0] = 'Keine Werbung';

$text = <a href=\"http://www.ebay.de\">www.ebay.de</a>
$text = preg_replace ("$suchmuster, $ersetzungen, $text");
?>

So jetzt habe ich aber das Problem, dass bei Werbelinks zu Shops dies z.B. so lauten könnte: http://shop.de/artikel-nr?refid=XXX

Dann setzte ich einfach "shop.de" ein habe ich gedacht, aber dann wird daraus http://Keine Werbung/artikel-nr?refid=XXX . Da es unendliche Artikeln in so Shops gibt suche ich nach einer Möglichkeit, dass sobald shop.de vorkommt alles mit Keine Werbung ersetzt wird, ohne dass ich jeden Artikel Link einsetze.
 
Also 1. sollte der Script so aussehen:

<?php
$suchmuster = array();
$suchmuster[0] = '/ebay.de/';

$ersetzungen = array();
$ersetzungen[0] = 'Keine Werbung';

$text = "<a href=\"http://www.ebay.de\">www.ebay.de</a>";
$text = preg_replace ($suchmuster, $ersetzungen, $text);
?>

Und 2. kann ich dir da auch nicht helfen.
 
Nur schnell nieder geschrieben und geht bestimmt noch besser
PHP:
<?php
function makePattern($f)
{
	return '#\<a href\="((http|https){1}\://)?(www\.)?'.$f.'([^"]*)"\>.*\</a\>#Uis';
}

$forbidden = array('shop.de');
$forbidden = array_map(makePattern, $forbidden);

$text = preg_replace($forbidden, 'Keine Werbung', $text);

?>

$text enthält deinen zu durchsuchenden Text.
$forbidden ist ein Array aller Domains, die du verbieten willst (ohne www oder dergleichen).

Gefunden werden alle Links der Art
Code:
<a href="http://www.tutorials.de/forum/php/...">...</a>
wobei der Link nur in href beachtet wird.

Code bitte immer in die dafür vorgesehenen Tags schreiben!

@DEDEX:
Was hat er von deinem Post?
 
Zuletzt bearbeitet:
Hallo und Danke, ich verstehe den Script nicht ganz und bitte um eine Erläuterung. Wieso steht da das Offset $f ,wenn ich hierfür keine Funktion finde, die nacher mit der Ersetzung zusammenhängt? Dann weiss ich, dass ich nicht nur shopA, sondern auch shopB habe, kann ich das dann so anwenden?

<?php
$text = "<a href=\"http://www.shopa.de\">shopa.de</a><br/><a href=\"http://www.shopb.de\">shopb.de</a>";

function makePattern($forbidden)
{
return '#\<a href\="((http|https){1}\://)?(www\.)?'.$forbidden.'([^"]*)"\>.*\</a\>#Uis';
}

$forbidden = array();
$forbidden = array_map(makePattern, $forbidden);
$forbidden[0] = '/shopa.de/';
$forbidden[1] = '/shopb.de/';

$text = preg_replace($forbidden, 'Keine Werbung', $text);

?>
 
Ich entschuldige mich für meine vorherigen Fehler und mache es hiermit wieder gut^^ Ich glaube, dass du folgendes meinst^^
Code:
<?php
$text = "<a href=\"http://www.shopa.de\">shopa.de</a><br/><a href=\"http://www.shopb.de\">shopb.de</a>";

function makePattern($f)
{
    return '#\<a href\="((http|https){1}\://)?(www\.)?'.$f.'([^"]*)"\>.*\</a\>#Uis';
}

$f = array('');
$f[0] = '/shopa.de/';
$f[1] = '/shopb.de/';
$suchmuster = array_map("makePattern", $f);

$ersetzungen = array();
$ersetzungen[0] = 'Keine Werbung';
$ersetzungen[1] = 'Keine Werbung';

(ich glaube, dass nur $ersetzungen = 'Keine Werbung'; in deinem Fall ausreichen würde)

$text = preg_replace($suchmuster, $ersetzungen, $text);

echo $text;
?>
 
Zuletzt bearbeitet von einem Moderator:
WIe schon erwähnt, ist $forbidden ein Array mit allen zu verbietenden Hosts/Domains
PHP:
$forbidden = array('domain1', 'domain2', 'domain3', ...);

Via array_map wird auf jeden dieser Hosts die Funktion "makePattern" aufgerufen, welche dir die Arbeit abnimmt, für jeden Host den Pattern per Hand zu erstellen. Du trägst also nur deine Hosts in das Array ein ohne http, www oder sonstiges.
Dein Problem bzgl. einem "Offset $f" verstehe ich nicht. $f ist ein ganz normaler Parameter einer Funktion (hier der Funktion makePattern).

Du musst also nur dieses eine Array befüllen und deinen zu druchsuchenden Text in der Variable $text haben (oder eben diese Variable im Code mit deiner ersetzten.)

Und noch einmal die Bitte die Code- bzw. PHP-BB-Tags zu benutzten, wenn hier Code gepostet wird!
 
kann ich dann als $ersetzung = array ('Keine Werbung', 'Keine Links zu anderen Seiten', usw.) machen?

Edit: Ich habe folgendes versucht, aber es geht nicht:

<?php
$text = "<a href=\"http://www.shopa.de/test/test/test/test\">shopa.de/test...</a><br/>http://www.shopb.de/test/test/test/test\">shopb.de/test...</a>";

function makePattern($f)
{
return '#\<a href\="((http|https){1}\://)?(www\.)?'.$f.'([^"]*)"\>.*\</a\>#Uis';
}

$forbidden = array('shopa.de','shopb.de');
$forbidden = array_map(makePattern, $forbidden);

$ersetzung = array('shopa.de ist verboten','shopb.de ist verboten');

$text = preg_replace($forbidden, $ersetzung, $text);

echo $text;
?>

Edit2: Auch dies geht nicht:
<?php
$text = "<a href=\"http://www.shopa.de/test/test/test/test\">shopa.de/test...</a><br/>http://www.shopb.de/test/test/test/test\">shopb.de/test...</a>";

function makePattern($f)
{
return '#\<a href\="((http|https){1}\://)?(www\.)?'.$f.'([^"]*)"\>.*\</a\>#Uis';
}

$forbidden = array();
$forbidden[0] = 'shopa.de';
$forbidden[1] = 'shopb.de';
$forbidden = array_map(makePattern, $forbidden);

$ersetzungen = array();
$ersetzungen[0] = 'Keine Werbung zu Online Händlern';
$ersetzungen[1] = 'Keine Werbung für andere Webseiten';

$text = preg_replace($forbidden, $ersetzungen, $text);

echo $text;
?>

Ich würde gerne schon mehrere Seiten sperren, also Pornografischen Inhalt, Online Händler, dann Betrügerseiten, Werbeseiten, ....

Edit: Klar kann es nicht gehen, wenn ich einen Fehler reinbaue^^ So funktiniert es jetzt:

Code:
<?php
$text = "<a href=\"http://www.shopa.de/test/test/test/test\">shopa.de/test...</a><br/><a href=\"http://www.shopb.de/test/test/test/test\">shopb.de/test...</a>";

function makePattern($f)
{
    return '#\<a href\="((http|https){1}\://)?(www\.)?'.$f.'([^"]*)"\>.*\</a\>#Uis';
}

$forbidden = array();
$forbidden[0] = 'shopa.de';
$forbidden[1] = 'shopb.de';
$suchmuster = array_map(makePattern, $forbidden);

$ersetzungen = array();
$ersetzungen[0] = 'Keine Werbung zu Online Händlern';
$ersetzungen[1] = 'Keine Werbung für andere Webseiten';

echo preg_replace($suchmuster, $ersetzungen, $text);
?>
 
Zuletzt bearbeitet von einem Moderator:
nun habe ich noch ne Frage, und zwar heisst es in meinem Forum, dass der Link so aussieht:
Code:
$text = <a class=\"postlink\" href=\"$url\" name=\"postlink\">$url</a>

Wie ich des class=\"postlink\" in des makePattern hinzufüge ist mir klar, aber wo muss name=\"postlink\" hin?

Edit: Ich weiss, dass ich des name="postlink" auch nach vorne ziehen kann, aber ich will wissen, wie ichs nach hinten setzen kann und des trotzdem geht.

Edit2:
Code:
    return '#\<a class="postlink" href\="((http|https){1}\://)?(www\.)?'.$f.'([^"]*)" name="postlink"\>.*\</a\>#Uis';

Ich denke so ist es korrekt, aber mein Script läuft danach nicht mehr^^ Mal schaun^^

Hat einer ne Idee, wie ich folgendes hinbekomme? Also statt keine Online-Händler, folgendes:

<a href="output.php?forbidden=" *Hier der Link* ">*Klick*</a>

Und so würde dann meine Output.php aussehen:

Code:
<?php
$_GET['forbidden'];
$link = $_GET['forbidden'];
echo "Diese Webseite $link hat illegale Einträge oder es handelt sich um einen Werbelink. Falls du trotzdem auf diese Webseite willst, so klicke bitte <a href="$link">hier</a>. Wir sind für diese Verlinkung nicht verantwortlich....";
?>

Also dadurch könnte ich dem user die Möglichkeit geben, den Link trotzdem aufzurufen. Also Text kann man ja beliebig ändern. z.B. könnte man auch vor Abo-Fallen warnen, schlechten Onlinehändlern, Ref-Links (also das andere User dran verdienen), ... aber trotzdem dem User keinerlei Informationen vorenthalten, wo sie was kaufen können.
 
Zuletzt bearbeitet von einem Moderator:
habs über Umwege mit RegEXP nun endlich hinbekommen, werde dies mal Posten, wenn ich Zeit habe^^

Code:
$suchmuster = array();
$suchmuster[0] = '/<a href=\"([^>]+?)"\>([^>]+?)<\/a>/';

$link = '\1';
....
 
:offtopic:
[ironie]
Hast du schon nach 1 Minute Zeit gefunden den Post zu machen? :rolleyes:
[/ironie]

In so einem Fall sollte man schon seinen vorherigen Eintrag editieren, vorallem wenn man bedenkt, dass er wohl nur gemacht wurde um einen zusätzlichen Post zu bekommen..


btt, ich find es aber gut, dass du deine Lösung anderen Mitglieder zur Verfügung stellst. Ich habs leider noch nicht angsehen und drüber nachgedacht, kann dir also keine Meinung dazu abgeben.


e:/ Jetzt hab ich doch kurz genauer drüber geschaut.

Benutz doch als Delimiter ein anderes Zeichen, dann brauchst du den Slash nicht escapen.

Warum suchst du in der ersten Klammer nach allem ungleich > ? Das stimmt eigentlich nicht genau, du suchst eigentlich nach allem ungleich ">. Außerdem wird hier wohl das EscapeZeichen an der falschen Stelle sein, vor dem Quote wäre es glaube ich passender.

In der zweiten klammer suchst du wieder nach allem ungleich >. Der schließende Tag beginnt aber mit < und nicht >, somit, imho, genau falsch herrum.

Hab mal etwas daran geändert, wie ich es tun würde. Bin aber selber nicht so sehr in Regex eingearbeitet.

$<a href=\"([^\">]+?)\">([^<]+?)</a>$
 
Zuletzt bearbeitet:
Zurück