2016-05-16 20 views
2

Ich habe ein Plugin erstellt, das Links in die Facebook Embedded-Version des Inhalts über den Link verwandelt. Mein Problem ist, wenn ich den Teil des Plugins für Kommentare deaktiviere, werden die Links zu Kommentaren eingebettete Posts (wenn der Post-Teil des Plugins noch aktiv ist).Unterscheiden zwischen zwei fast identische Links in Regex

Werfen wir einen Blick, so haben wir 3 Links:

Facebook

posten
<a href="https://www.facebook.com/zuck/posts/10102577175875681" target="_blank">ONE</a> 

Kommentar

<a href="https://www.facebook.com/zuck/posts/10102577175875681?comment_id=1193531464007751" target="_blank">Two</a> 

und eine Antwort auf einen Kommentar

<a href="https://www.facebook.com/zuck/posts/10102577175875681?comment_id=1193531464007751&reply_comment_id=10102577641662241" target="_blank">Three</a> 

mit alle drei lin ks beginnend mit

https://www.facebook.com/zuck/posts/10102577175875681 

Im folgenden Code, der, wenn die Bedingungen meine Einstellung schaltet sind, und dieser Beitrag Nachricht gleich, was ein Benutzer Beitrag, so in diesem Beispiel dieser Beitrag Nachricht über die drei Verbindungen gleich ist.

Dies ist das Plugin, das ich für die Konvertierung dieser Links erstellt habe.

if ($this->registry->options['drcae_facebook_comment_onoff']) { 
    // swaps facebook comment links to embed code 
    $drc_embed_facebook_cmt = '<div class="fb-comment-embed" data-include-parent="true" data-width="560" data-href="https://www.facebook.com/$3/posts/$4comment_id=$5"></div>'; 
    $this->post['message'] = preg_replace('~<a (.*)href="(.*)facebook.com/(.*)/posts/(.*)?comment_id=(.*)"(.*)<\/a>~', $drc_embed_facebook_cmt, $this->post['message']); 
} 

if ($this->registry->options['drcae_facebook_post_onoff']) { 
    // swaps facebook post links to embed code 
    $drc_embed_facebook_post = '<div class="fb-post" data-href="https://www.facebook.com/$3/posts/$4"></div>'; 
    $this->post['message'] = preg_replace('~<a (.*)href="(.*)facebook.com/(.*)/posts/(.*)"(.*)<\/a>~', $drc_embed_facebook_post, $this->post['message']); 
} 

Ich habe tat dies in die andere Richtung gekippt (post sein erstes), aber dies verursacht Kommentare der Beiträge einzubetten, bekam ich diese um für Kommentare indem Sie zuerst die wahrscheinlich nicht der beste Weg ist, zu tun.

Sie haben vielleicht meine Regex bemerkt, es ist nicht die größte, aber es ist, was ich in der Lage war, die Arbeit selbst zu machen, völlig neu zu sein.

~<a (.*)href="(.*)facebook.com/(.*)/posts/(.*)"(.*)<\/a>~ 

Ich wähle meinen regex diese Art und Weise zu tun, damit es eine Rolle, didnt, wenn ein Link wie folgt aus wäre es immer noch einbetten formatiert wurde:

<a target="blank" href="https://www.facebook.com/USERNAME/posts/1234567890" alt="facebook post">LINK</a> 

Aber jetzt bin ich zweit meine Arbeit zu erraten, und Nachdem ich gesucht hatte und nichts gefunden hatte, dachte ich, ich würde um Hilfe bitten.

Wie kann ich zwischen diesen Links unterscheiden, so Beiträge, stören nicht mit Kommentaren/mit Kommentaren antworten?

Update 1, embeded Beiträge

Jetzt ist mein Plugin wie dieses

~<a (.*?)facebook\.com/([^/]+)/[^/]+/([0-9]+)(?:[?][^0-9]+([0-9]+)(?:&(.+))?)?</a>~ 

Ich habe am Anfang gesagt

$drc_embed_facebook_post = '<div class="fb-post" data-href="https://www.facebook.com/$2/posts/$3"></div>'; 
$this->post['message'] = preg_replace('~<a (.*?)facebook\.com/([^/]+)/[^/]+/([0-9]+)(?:[?][^0-9]+([0-9]+)(?:&(.+))?)?</a>~', $drc_embed_facebook_post, $this->post['message']); 

Regex sieht links ein faul etwas? Ich glaube ... www. https: // ect ... (alles, was vor facebook.com kommt)

Dies funktioniert teilweise, greifen Links direkt auf Beiträge hier sind ein paar Beispiele.

https://www.facebook.com/RyanNewMe/posts/616837631826216?pnref=story 
https://www.facebook.com/zuck/posts/10102833246942211?pnref=story 
https://www.facebook.com/zuck/posts/10102830259184701?pnref=story 

Diese Links betten den Beitrag nicht ein.Wenn ich jedoch ?pnref=story von allen lösche, funktioniert nur der folgende Link nicht.

https://www.facebook.com/RyanNewMe/posts/616837631826216 

Antwort

0

Ich habe einen schönen, schnellen Regex die hrefearlier today, zu extrahieren, so wird mich, dass als Grundlage verwenden:

<a(?:\s*(?!href)[^\s>]*)*\s*href=["']([^"']+) 

Wenn Sie diese Regex verwenden, erhalten Sie unabhängig von der Der Wert des Attributs href entspricht der Übereinstimmung. Zum Beispiel:

https://www.facebook.com/zuck/posts/10102577175875681 

https://www.facebook.com/zuck/posts/10102577175875681?comment_id=1193531464007751 

https://www.facebook.com/zuck/posts/10102577175875681?comment_id=1193531464007751&reply_comment_id=10102577641662241 

Dann können Sie diesen Abschnitt analysieren.

ich diese Regex gemacht, die zu funktionieren scheint:

facebook\.com/([^/]+)/[^/]+/([0-9]+)(?:[?][^0-9]+([0-9]+)(?:&(.+))?)? 

Sie sollten in $1, $2, $3 und $4 für "zuck", das Original-ID, Kommentar-ID und den gesamten Rest finden Ihre Spiele der Verbindung jeweils. (Ja, ich habe faul am Ende, brauchen Sie das Ende des Links in Stücke zerlegt?)

Es sieht wirklich komplex aus, aber es ist eigentlich ziemlich verständlich.

  • facebook\.com/ Streichhölzer facebook.com/

  • [^\]+ für ein oder mehrere Nicht-Schrägstriche

  • ([0-9]+) fängt eine oder mehrere Zahlen

  • Dieser Blob: (?:[?][^0-9]+([0-9]+)(?:&(.+))?)? die optionalen Erweiterungen gibt (das ist der Ende ? s).

    • Die (?:) bedeutet nicht Erfassungsgruppe (meist die Namen von $2 und $3 zu vermeiden erhöht wird).
    • [?][^0-9]+ bedeutet, dass es eine ? gefolgt von einigen Nicht-Ziffern gibt.
    • ([0-9]+) fängt Ziffern
    • &(.+) ein & passt und fängt dann den Rest des Strings.

Edit: Ihr Update betrifft, so kann die Regex wie folgt festgelegt werden (es sei denn, ich das Problem bin fehlt):

~<a (.*?)facebook\.com/([^/]+)/[^/]+/([0-9]+)(?:[?][^0-9<]+([0-9]*)(?:&([^<]+))?)?</a>~ 
+0

machen mir Fragen hier stapeln, aber wie! lol, ich verstehe, was es tut, aber wie in der Welt habt ihr die richtigen Regexs? Ich habe Gene, Tuts und Posts nach Posts probiert. Ich kann mir keine Regex einfallen lassen, um mein Leben zu retten ich benutze ALLES '(. *)' lol. aber wenn ich das richtig unterzeichne, kann ich die ganze '~ ~' and use... 'preg_replace('~

+0

and something feels off, this bit 'facebook\.com/[^/]+/[^/]+/([0-9]+)' should contain $1 and $2 we need to change zuck and the post number –

+1

@DrCustUmz The end of that should be '(?:&(.+))?)? ~' ablegen, und der Start könnte faul sein wie: ' Laurel

Verwandte Themen