2017年4月30日 星期日

能找到最內層的tag的正規表示法

今天要來介紹一個能找到最內層一組tag的正規表示法,

例如有一個需求如下:
tag格式為[quotePostId=XX]YY[/quotePostId],XX填數字,YY填文字,
可嵌套,如何從以下tag嵌套中找出最內層的XX和YY:
[tagId=1]kk[tagId=2][tagId=3]kk[/tagId]kk[/tagId][/tagId]

這裡提供一個解法,匹配的Group1即為XX、Group2為YY
\[tagId=(\d+)\](?=((?:[^\[]|\[(?!(?:tagId=\d+\]|\/tagId\])))*))\2\[\/tagId\]

下面來做解釋:
思路是:

  1. 必須符合[tagId=XX]YY[/tagId]。
  2. XX必須為非空值之數字。
  3. YY可為空值或任何字元。
  4. YY不可含有[tagId=??]或[/tagId],因為含有即代表此次匹配YY不為最內層tag之內容。

實作步驟(???為還未確定的部份,用紅色標色,當下確定的地方用藍色標色,之前確定的用黑色標色):

  1. 首先因為必須符合[tagId=XX]YY[/tagId],即XX必須為非空值之數字,所以先寫出一開始的正規表示法。
    \[tagId=(\d+)\](???)\[\/tagId\]
  2. 歩驟1的???需要符合條件(思路4)才須匹配,否則匹配不成功,因為x(?=y)這個語法不會把y算在匹配成功的字串內,所以用\2來裝Group2選到的YY放到tag中間。
    \[tagId=(\d+)\](?=(???))\2\[\/tagId\]
  3. YY可為空值,所以在Group2裡面放一個不記Group編號的Group,然後此Group可以0到多個。
    \[tagId=(\d+)\](?=((?:???)*))\2\[\/tagId\]
  4. 開始匹配YY,分成碰到非左中括弧( [ )、或是左中括弧的兩種情況。
    當是左中括弧時,根據後面接的字串決定要不要匹配。
    \[tagId=(\d+)\](?=((?:[^\[]|\[(???))*))\2\[\/tagId\]
  5. 如是是左中括弧時,根據後面接的字串情況決定要不要匹配,不匹配的情況有兩種,
    第一種:為[tagId=x]
    \[tagId=(\d+)\](?=((?:[^\[]|\[(?!(?:tagId=\d+\]|???)))*))\2\[\/tagId\]
    第二種:為[/tagId]
    \[tagId=(\d+)\](?=((?:[^\[]|\[(?!(?:tagId=\d+\]|\/tagId\])))*))\2\[\/tagId\]

最後我們完成了正規表示法:
\[tagId=(\d+)\](?=((?:[^\[]|\[(?!(?:tagId=\d+\]|\/tagId\])))*))\2\[\/tagId\]

以下為可測試的線上工具:

  1. 圖示化正規表示法
  2. 正規表示法線上實驗,可以檢查Group1、Group2有沒有取到。

2017年4月29日 星期六

Instagram

今天要介紹的是如何取得Instagram的Access Token,及
用Access Token來取得使用者的資訊,如發佈的貼文(Instagram的貼文都是圖片或影片)圖片url等。

今天的需求是:

  1. 想要取得自己在Instagram上面的貼文圖片。
  2. 想要將取得的貼文圖片展示在網頁上。

使用技術:

  1. JSP
  2. Jquery

先講Instagram 官方步驟

  1. 一開始如果沒有Instagram帳號,請註冊一個。
  2. 進入Instagram的developer console,填好相關資訊註冊成為Developer。
  3. 自己建立一個網頁,假設網址為REDIRECT-URI
  4. Manage Clients建立一個App,其中"Valid redirect URIs"填上步驟3的REDIRECT-URI
  5. 進入
    https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code
    其中 CLIENT-ID 為已建立之App的 CLIENT-ID , REDIRECT-URI 即為自己建立網頁的網址。
  6. 待使用者登入並授權以後,會被引導至 REDIRECT-URI 頁面,並會以GET方式在Url後面帶上一個 code 參數。
  7. 這個 code 只能用一次,
    以以下參數
    client_id : App的client_id
    client_secret : App的client_secret
    grant_type : "authorization_code"
    redirect_uri : App的redirect_uri
    code : 剛剛得到的code
    請求 https://api.instagram.com/oauth/access_token,
    成功的話會在Response中得到access_token的參數,即我們要PO文資訊時需要的access_token。
  8. 要到access_token以後,就可以用來要各種使用者的資料了,在Developer console的左邊"Endpoints"中有提供各種Endpoints,這邊我們使用下面這個就好:
    https://api.instagram.com/v1/users/self/media/recent/?access_token=ACCESS_TOKEN
    請在ACCESS_TOKEN填上剛要到的,代表使用者的ACCESS_TOKEN,成功的話會回傳使用者最近的照片PO文資料。

下面以實測的程式碼來演示,