2016-05-12 6 views
1

Dies ist so ziemlich die gleichen Informationen wie ein früherer Post von mir, aber es ist eine andere Frage.entfernen Schrägstrich von Hyperlink href

Ich habe eine Variable von $this->post['message'] was ist der Benutzer Beiträge.

Wenn der Benutzer-Beiträge:

Check out this vine https://vine.co/v/iF20jKHvnqg/ 

Sobald die HTML-Ausgabe vorgelegt wie folgt aussieht:

Check out this vine <a href="https://vine.co/v/iF20jKHvnqg/" target="_blank">https://vine.co/v/iF20jKHvnqg/</a> 

und das ist, was $this->post['message'] gleich ist. Diese findet Rebe Links in Beiträgen und wandelt sie in der einen Iframe

Also in meinem hinteren Ende habe ich ein Plugin

$drc_embed_vine = '<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>'; 

$this->post['message'] = preg_replace('~(<a href="https?://vine.co)/v/(.*)" target="_blank">(https?://vine.co)/v/(.*)<\/a>~', $drc_embed_vine, $this->post['message']); 

erstellt. Ich habe allerdings ein Problem mit dem Endslash.

Wenn ein Benutzer https://vine.co/v/iF20jKHvnqg postet, der einmal in <a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a> umgewandelt wird, wird er in einen iframe-Fehler umgewandelt.

Aber wenn der Benutzer https://vine.co/v/iF20jKHvnqg/, die sich zu <a href="https://vine.co/v/iF20jKHvnqg/" target="_blank">https://vine.co/v/iF20jKHvnqg/</a> ändert, wird es nicht konvertiert. Der Unterschied ist der Schrägstrich.

Jetzt habe ich versucht:

$this->post['message'] = rtrim($this->post['message'],"/"); 

$drc_embed_vine = '<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>'; 

$this->post['message'] = preg_replace('~(<a href="https?://vine.co)/v/(.*)" target="_blank">(https?://vine.co)/v/(.*)<\/a>~', $drc_embed_vine, $this->post['message']); 

Aber das scheint nicht zu arbeiten, ist es eine Möglichkeit, ich Rebe Links innerhalb von $this->post['message'] ausrichten kann und den abschließenden Schrägstrich entfernen, oder sogar den abschließenden Schrägstrich entfernen jeder Link in $this->post['message']

Also, wenn

$this->post['message'] = 'Go to <a href="http://stackoverflow.com/questions/ask/" target="_blank">http://stackoverflow.com/questions/ask/</a>'; 

Es

werden würde
$this->post['message'] = 'Go to <a href="http://stackoverflow.com/questions/ask" target="_blank">http://stackoverflow.com/questions/ask</a>'; 

Ich bin hauptsächlich auf die Vine Links im Moment konzentriert, aber wenn es möglich ist, für alle Links, die auf lange Sicht besser funktionieren können.So

Meine letzten gescheiterten Versuch (ich bin immer noch versuchen, das herauszufinden)

$drc_embed_vine = '<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>'; 
$str = $this->post['message']; 
$str = rtrim($str, '/'); 
$str = preg_replace('~(<a href="https?://vine.co)/v/(.*)" target="_blank">(https?://vine.co)/v/(.*)<\/a>~', $drc_embed_vine, $str); 

Versuchte etwas anderes nur rumgespielt habe ich dies einen Schuss

$str = $this->post['message']; 
$str = rtrim($str, '/'); 

$this->post['message'] = $str; 

der Pfosten ist

<a href="http://vine.co/v/iF20jKHvnqg/" target="_blank">http://vine.co/v/iF20jKHvnqg/</a> 

und die rtrim hatte keine Wirkung =/

aber wenn ich

$this->post['message'] = $str; 

zu

$this->post['message'] = test; 

jeder Beitrag TEST dreht sich zu ändern, so sehe ich nicht, warum die rtrim nicht hat effect =/

Aktualisierung für Klarheit

$this->post['message'] = 'Check out this vine <a href="http://vine.co/v/iF20jKHvnqg/" target="_blank">http://vine.co/v/iF20jKHvnqg/</a>'; 
$drc_embed_vine = '<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>'; 
$str = $this->post['message']; 
$str = rtrim($str, '/'); 
$str = preg_replace('~(<a href="https?://vine.co)/v/(.*)" target="_blank">(https?://vine.co)/v/(.*)<\/a>~', $drc_embed_vine, $str); 

FUNKTIONS UPDATE!

Nach Richards Antwort spielte ich mit dem ein Bit-Plug-und kam mit

$drc_embed_vine = '<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>'; 
$this->post['message'] = preg_replace('+/(["<])+', '$1', $this->post['message']); 
$this->post['message'] = preg_replace('~(<a href="https?://vine.co)/v/(.*)" target="_blank">(https?://vine.co)/v/(.*)<\/a>~', $drc_embed_vine, $this->post['message']); 

Dies funktioniert auf! =) aber ist es der effizienteste Weg ...?

+0

Können Sie einfachere Beispiel ohne alle Gespräche erstellen, was sonst nicht funktioniert? Ich sehe nicht, wo der $ this-> post ['message'] konvertiert wird. rtrim würde natürlich nicht funktionieren, wenn die Variable mit endet. – Richard

+0

Ich werde etwas zum OP hinzufügen, damit es besser formatiert ist, was brauchst du mehr? –

+0

Hinzugefügt ein kleines Beispiel –

Antwort

1

das Beispiel unten sehen. Ich denke, dass Ihre Frage zu kompliziert ist, und ich sehe den Code nicht, der das Ersetzen von $ post -> ['Nachricht'] behandelt, oder den Link für den iframe erzeugt.

Aber ich habe versucht, ein Beispiel so einfach wie möglich zu erhalten, um das Problem zu imitieren, dass Sie

// input 
$user = 'Check out this vine https://vine.co/v/iF20jKHvnqg/'; 
$after = 'Check out this vine <a href="https://vine.co/v/iF20jKHvnqg/" target="_blank">https://vine.co/v/iF20jKHvnqg/</a>'; 

// todo 
$trim_user = rtrim($user, '/'); 
$trim_after = preg_replace('+/(["<])+', '$1', $after); 

// output 
echo "trim_user $trim_user\n"; 
echo "trim_after $trim_after\n"; 

so gibt es zwei Eingänge, die Sie haben können, zu lösen sind versuchen - die ursprüngliche Nachricht aus Benutzer in $ user oder der ersetzte Text mit HTML-Links in $ nach.

Dann auf dem $ Benutzer, ich teste gerade die rtrim, die funktioniert.

Auf dem $ nach, ich brauche alle Vorkommen von/vor ersetzen "oder <. Es ist wegen der Zitate zum Thema‚‘in und schließenden Tag. Ich bin sowohl mit einem regulären Ausdruck zu ersetzen.

die Parameter anzeigen 1. ist der reguläre Ausdruck, der dem Muster entspricht, 2. ist der Ersatz für das übereinstimmende Muster, ich überspringe den Schrägstrich/und benutze nur den zweiten Teil, den ich behalten muss.

[] eckige Klammern in regexp bedeutet group von Zeichen - wie [abc] ist irgendein Zeichen des a, b oder c. Wenn es ist - es ist ein Bereich. Wie [az] ist irgendetwas zwischen a und z.

() Klammern bedeutet eine Gruppe, die in $ 1, $ 2, $ 3 basierend auf der Reihenfolge der Gruppe gespeichert wird. In diesem Fall gibt es nur eine Gruppe, also verweise ich auf $ 1.

In einem anderen Worten/und jedes Zeichen aus "und < wird durch die" Zwischenablage "$ 1 ersetzt. Das ist wieder entweder" oder <.

Letzte Sache, schreibe ich die Ausgabe auf die Konsole.

trim_user Check out this vine https://vine.co/v/iF20jKHvnqg 
trim_after Check out this vine <a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a> 

Edited basierend auf Beispiel

können Sie vermeiden, indem Sie den/die Erfassung [^ /] * statt. * In der().

class Example 
{ 

    public function run() 
    { 
     $this->post['message'] = 'Check out this vine <a href="http://vine.co/v/iF20jKHvnqg/" target="_blank">http://vine.co/v/iF20jKHvnqg/</a>'; 
     $drc_embed_vine = '<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>'; 
     $str = $this->post['message']; 
     $str = rtrim($str, '/'); 
     $str = preg_replace('~(<a href="https?://vine.co)/v/([^/]*)/?" target="_blank">(https?://vine.co)/v/(.*)<\/a>~', $drc_embed_vine, $str); 

     echo $str; 
    } 
} 

$example = new Example(); 
$example->run(); 
+0

ahh Ich verstehe, was du meinst der Post, ich benutze ein CMS, vBulletin um genau zu sein, '$ this-> post ['message']' ist nur gleich, was auch immer der Benutzer postet, hat zu Ende lesen Sie Ihren Beitrag immer noch obwohl =) –

+0

Dies war nicht eine direkte Antwort, aber ich habe Ergebnisse =) Lassen Sie mich schnell damit herumspielen und ich poste zurück, um Sie zu aktualisieren, DANKE! –

+0

Siehe die Antwort nach der fett bearbeiteten Überschrift. – Richard

0

Versuchen Sie, diese

$str = $this->post['message']; 
$str = rtrim($str, '/'); 
+0

scheint, wie es funktionieren sollte, basierend auf dieser Antwort habe ich versucht $ drc_embed_vine = '