2016-05-16 8 views
2

Я создал плагин, который превращает ссылки в встроенную версию содержимого Facebook по ссылке. Моя проблема в том, что если я отключу часть плагина для комментариев, ссылки на комментарии станут встроенными сообщениями (если часть сообщения плагина все еще активна).различают две почти идентичные ссылки в regex

Давайте посмотрим, поэтому у нас есть 3 ссылки:

Facebook Опубликовать

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

Комментарий

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

и ответ на комментарий

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

с все три lin кс, начиная с

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

В следующем коде, если условия являются мои настройки переключается, и этот пост сообщение равно то, что посты пользователя, поэтому в данном примере это сообщение сообщение равно трем ссылкам выше.

Это плагин, который я создал для преобразования этих ссылок.

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']); 
} 

Я имел это перевернуто в другую сторону (после того первым), но это вызвало комментарии встраивать сообщения, я получил вокруг этого, проверяя для комментариев первых что, вероятно, не самый лучший способ сделать это.

Итак, вы, возможно, заметили мое регулярное выражение, это не самое большое, но это то, что я смог сделать самостоятельно, будучи новым для регулярного выражения.

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

Я выбираю сделать мои регулярные выражения этим путем, так оно не имеет значения, если ссылка была отформатирована как следующий он все равно встраивать:

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

Но теперь я второй угадал мою работу, и после поиска и не придумывая ничего, я решил, что попрошу о помощи.

Как я могу различать эти ссылки так, чтобы сообщения, не мешали комментариям/ответам с комментариями?

Update 1, погруженные сообщения

Теперь мой плагин выглядит следующим образом

$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 специально

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

Я оставил начало ленивого что-нибудь? Я считаю ... не ограничивать www. https: // ect ... (все, что приходит до facebook.com)

Это частично работает, захватывая ссылки непосредственно на сообщения, вот несколько примеров.

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 

Эти ссылки не вставляют сообщение.Однако, если я удалю ?pnref=story из них, только следующая ссылка не работает.

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

ответ

0

Я создал хорошее, быстрое регулярное выражение для извлечения hrefearlier today, поэтому я буду использовать это в качестве основы:

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

Если вы используете это регулярное выражение, вы получите независимо от значение атрибута href соответствует совпадению. Например:

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 

Затем вы можете разобрать этот раздел.

Я сделал это регулярное выражение, которое, кажется, работает:

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

Вы должны найти свои матчи в $1, $2, $3 и $4 для «Zuck», оригинального идентификатор, комментарий идентификатора, и всех остальных соответственно. (Да, я получил ленивый в конце там, вам нужно, чтобы конец ссылки разобран на части?)

Он выглядит действительно сложным, но на самом деле это довольно понятно.

  • facebook\.com/ матчи facebook.com/

  • [^\]+ соответствует одному или более не-слэш

  • ([0-9]+) захватывает один или несколько номеров

  • Это блоб: (?:[?][^0-9]+([0-9]+)(?:&(.+))?)? определяет дополнительные расширения (это завершено ? s).

    • The (?:) означает не группа записи (в основном, чтобы избежать приращения имен $2 и $3).
    • [?][^0-9]+ означает, что есть ?, за которым следует несколько цифр.
    • ([0-9]+) захватывает цифру
    • &(.+) совпадает с &, а затем захватывает оставшуюся часть строки.

Edit: Что касается вашего обновления, регулярное выражение может быть исправлено, как это (если я не хватает проблемы):

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

Создание меня стек вопросы здесь, но КАК! lol, я понимаю, что он делает, но как в мире вы, ребята, придумали правильное регулярное выражение? Я пробовал gens, tuts и сообщения после сообщений, я не могу придумать регулярное выражение, чтобы спасти мою жизнь, просто вырос любите использовать НИЧЕГО '(. *)' lol. но если я правильно это рассмотрю, я могу отбросить все '~ ~' 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 '(?:&(.+))?)? ~', и начало может быть ленивым, как: ' Laurel