区分正则表达式中两个几乎相同的链接
differentiate between two almost identical links in regex
我创建了一个插件,可以将 links 转换为 link 中内容的 Facebook 嵌入式版本。我的问题是,如果我禁用插件的评论部分,评论的 links 就会嵌入 posts(如果插件的 post 部分仍然处于活动状态)。
让我们看一下,所以我们有 3 links:
脸书post
<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>
所有三个 link 都以
开头
https://www.facebook.com/zuck/posts/10102577175875681
在下面的代码中,if 条件是我的设置切换,这个 post 消息等于用户 posts,所以在这个例子中这个 post 消息等于上面的三个link.
这是我为转换这些 links 而创建的插件。
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//posts/comment_id="></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//posts/"></div>';
$this->post['message'] = preg_replace('~<a (.*)href="(.*)facebook.com/(.*)/posts/(.*)"(.*)<\/a>~', $drc_embed_facebook_post, $this->post['message']);
}
我确实把这个翻转了(post 是第一个)但这导致评论嵌入 posts,我通过首先检查评论来解决这个问题,这可能不是最好的方法。
所以你可能已经注意到我的正则表达式,它不是最好的,但它是我能够自己完成的工作,完全是正则表达式的新手。
~<a (.*)href="(.*)facebook.com/(.*)/posts/(.*)"(.*)<\/a>~
我选择以这种方式做我的正则表达式,所以如果 link 被格式化为如下它仍然嵌入并不重要:
<a target="blank" href="https://www.facebook.com/USERNAME/posts/1234567890" alt="facebook post">LINK</a>
但现在我正在猜测我的工作,在搜索但没有提出任何建议之后,我想我会寻求一些帮助。
我如何区分这些 link,所以 post,不要干扰评论/评论回复?
更新 1,嵌入 posts
现在我的插件看起来像这样
$drc_embed_facebook_post = '<div class="fb-post" data-href="https://www.facebook.com//posts/"></div>';
$this->post['message'] = preg_replace('~<a (.*?)facebook\.com/([^/]+)/[^/]+/([0-9]+)(?:[?][^0-9]+([0-9]+)(?:&(.+))?)?</a>~', $drc_embed_facebook_post, $this->post['message']);
正则表达式
~<a (.*?)facebook\.com/([^/]+)/[^/]+/([0-9]+)(?:[?][^0-9]+([0-9]+)(?:&(.+))?)?</a>~
我一开始就懒什么?我相信...不要限制 www。 https:// ect...(facebook.com 之前的任何内容)
这部分有效,直接将 links 抓取到 posts 这里有几个例子。
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
这些 link 不嵌入 post。但是,如果我从它们中删除 ?pnref=story
,只有以下 link 不起作用。
https://www.facebook.com/RyanNewMe/posts/616837631826216
我创建了一个漂亮、快速的正则表达式来提取 href
earlier 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]+)(?:&(.+))?)?
您应该在 </code>、<code>
、</code> 和 <code>
中为 "zuck"、原始 ID、评论 ID 和link 的其余部分分别。 (是的,我在最后得到了lazy,你需要把link的结尾解析成碎片吗?)
看起来很复杂,其实很好理解。
facebook\.com/
匹配 facebook.com/
[^\]+
匹配一个或多个非斜杠
([0-9]+)
捕获一个或多个数字
此 blob:(?:[?][^0-9]+([0-9]+)(?:&(.+))?)?
指定可选扩展名(即结尾的 ?
)。
(?:)
表示非捕获组(主要是为了避免增加 </code> 和 <code>
的名称)。
[?][^0-9]+
表示有一个 ?
后跟一些非数字。
([0-9]+)
捕获数字
&(.+)
匹配一个 &
然后捕获字符串的其余部分。
编辑:关于您的更新,正则表达式可以这样修复(除非我遗漏了问题):
~<a (.*?)facebook\.com/([^/]+)/[^/]+/([0-9]+)(?:[?][^0-9<]+([0-9]*)(?:&([^<]+))?)?</a>~
我创建了一个插件,可以将 links 转换为 link 中内容的 Facebook 嵌入式版本。我的问题是,如果我禁用插件的评论部分,评论的 links 就会嵌入 posts(如果插件的 post 部分仍然处于活动状态)。
让我们看一下,所以我们有 3 links:
脸书post
<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>
所有三个 link 都以
开头https://www.facebook.com/zuck/posts/10102577175875681
在下面的代码中,if 条件是我的设置切换,这个 post 消息等于用户 posts,所以在这个例子中这个 post 消息等于上面的三个link.
这是我为转换这些 links 而创建的插件。
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//posts/comment_id="></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//posts/"></div>';
$this->post['message'] = preg_replace('~<a (.*)href="(.*)facebook.com/(.*)/posts/(.*)"(.*)<\/a>~', $drc_embed_facebook_post, $this->post['message']);
}
我确实把这个翻转了(post 是第一个)但这导致评论嵌入 posts,我通过首先检查评论来解决这个问题,这可能不是最好的方法。
所以你可能已经注意到我的正则表达式,它不是最好的,但它是我能够自己完成的工作,完全是正则表达式的新手。
~<a (.*)href="(.*)facebook.com/(.*)/posts/(.*)"(.*)<\/a>~
我选择以这种方式做我的正则表达式,所以如果 link 被格式化为如下它仍然嵌入并不重要:
<a target="blank" href="https://www.facebook.com/USERNAME/posts/1234567890" alt="facebook post">LINK</a>
但现在我正在猜测我的工作,在搜索但没有提出任何建议之后,我想我会寻求一些帮助。
我如何区分这些 link,所以 post,不要干扰评论/评论回复?
更新 1,嵌入 posts
现在我的插件看起来像这样
$drc_embed_facebook_post = '<div class="fb-post" data-href="https://www.facebook.com//posts/"></div>';
$this->post['message'] = preg_replace('~<a (.*?)facebook\.com/([^/]+)/[^/]+/([0-9]+)(?:[?][^0-9]+([0-9]+)(?:&(.+))?)?</a>~', $drc_embed_facebook_post, $this->post['message']);
正则表达式
~<a (.*?)facebook\.com/([^/]+)/[^/]+/([0-9]+)(?:[?][^0-9]+([0-9]+)(?:&(.+))?)?</a>~
我一开始就懒什么?我相信...不要限制 www。 https:// ect...(facebook.com 之前的任何内容)
这部分有效,直接将 links 抓取到 posts 这里有几个例子。
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
这些 link 不嵌入 post。但是,如果我从它们中删除 ?pnref=story
,只有以下 link 不起作用。
https://www.facebook.com/RyanNewMe/posts/616837631826216
我创建了一个漂亮、快速的正则表达式来提取 href
earlier 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]+)(?:&(.+))?)?
您应该在 </code>、<code>
、</code> 和 <code>
中为 "zuck"、原始 ID、评论 ID 和link 的其余部分分别。 (是的,我在最后得到了lazy,你需要把link的结尾解析成碎片吗?)
看起来很复杂,其实很好理解。
facebook\.com/
匹配facebook.com/
[^\]+
匹配一个或多个非斜杠([0-9]+)
捕获一个或多个数字此 blob:
(?:[?][^0-9]+([0-9]+)(?:&(.+))?)?
指定可选扩展名(即结尾的?
)。(?:)
表示非捕获组(主要是为了避免增加</code> 和 <code>
的名称)。[?][^0-9]+
表示有一个?
后跟一些非数字。([0-9]+)
捕获数字&(.+)
匹配一个&
然后捕获字符串的其余部分。
编辑:关于您的更新,正则表达式可以这样修复(除非我遗漏了问题):
~<a (.*?)facebook\.com/([^/]+)/[^/]+/([0-9]+)(?:[?][^0-9<]+([0-9]*)(?:&([^<]+))?)?</a>~