2012-03-29 6 views
1

私はOSticketシステムで "linkify"を実装しましたが、文書化http://jmrware.com/articles/2010/linkifyurl/linkify.phpに気付かなかった1つの欠陥を除いて、すばらしく動作しているようです。リンクの後にa)が続くと、そのリンクには)が含まれます。 grrrがlinkify php関数のためのregexの固定括弧?

だから私はlinkifyは今、数年に更新されていないかのように見てデバッグすることができるかもしれないそこに任意のスーパー正規表現の男があるかどうか...。ここ

は正規表現があればあると思いまして必要に応じて:

$url_pattern = '/# Rev:20100913_0900 github.com\/jmrware\/LinkifyURL 
    # Match http & ftp URL that is not already linkified. 
     # Alternative 1: URL delimited by (parentheses). 
     (\()      # $1 "(" start delimiter. 
     ((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+) # $2: URL. 
     (\))      # $3: ")" end delimiter. 
    | # Alternative 2: URL delimited by [square brackets]. 
     (\[)      # $4: "[" start delimiter. 
     ((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+) # $5: URL. 
     (\])      # $6: "]" end delimiter. 
    | # Alternative 3: URL delimited by {curly braces}. 
     (\{)      # $7: "{" start delimiter. 
     ((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+) # $8: URL. 
     (\})      # $9: "}" end delimiter. 
    | # Alternative 4: URL delimited by <angle brackets>. 
     (<|&(?:lt|\#60|\#x3c);) # $10: "<" start delimiter (or HTML entity). 
     ((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+) # $11: URL. 
     (>|&(?:gt|\#62|\#x3e);) # $12: ">" end delimiter (or HTML entity). 
    | # Alternative 5: URL not delimited by(), [], {} or <>. 
     (      # $13: Prefix proving URL not already linked. 
     (?:^    # Can be a beginning of line or string, or 
     | [^=\s\'"\]]   # a non-"=", non-quote, non-"]", followed by 
     ) \s*[\'"]?   # optional whitespace and optional quote; 
     | [^=\s]\s+    # or... a non-equals sign followed by whitespace. 
    )      # End $13. Non-prelinkified-proof prefix. 
     (\b      # $14: Other non-delimited URL. 
     (?:ht|f)tps?:\/\/  # Required literal http, https, ftp or ftps prefix. 
     [a-z0-9\-._~!$\'()*+,;=:\/?#[\]@%]+ # All URI chars except "&" (normal*). 
     (?:     # Either on a "&" or at the end of URI. 
      (?!     # Allow a "&" char only if not start of an... 
      &(?:gt|\#0*62|\#x0*3e);     # HTML ">" entity, or 
      | &(?:amp|apos|quot|\#0*3[49]|\#x0*2[27]); # a [&\'"] entity if 
      [.!&\',:?;]?  # followed by optional punctuation then 
      (?:[^a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]|$) # a non-URI char or EOS. 
     ) &     # If neg-assertion true, match "&" (special). 
      [a-z0-9\-._~!$\'()*+,;=:\/?#[\]@%]* # More non-& URI chars (normal*). 
     )*      # Unroll-the-loop (special normal*)*. 
     [a-z0-9\-_~$()*+=\/#[\]@%] # Last char can\'t be [.!&\',;:?] 
    )      # End $14. Other non-delimited URL. 
    /imx'; 

私はそれで遊んで始めたが、それは私の頭の上のビットであることが分かります。私はlinkifyの代わりに他の代替の提案もしていますか?

最後の2行目を書き留めた場合:# Last char can\'t be [.!&\',;:?]基本的には、そこにa)を追加するといいでしょうか?有効なURLリンクがで括弧を有していてもよく

\b(?:ht|f)tps?://[^\s<>"']+(?![][()<>{}.,!?:;"']) 
+0

: – ridgerunner

答えて

0

あなただけのHTTP/FTPのURLのように見えますが、句読点などで終了していない部分文字列にマッチさせたい場合は

は、あなたのような単純なものを使用することができますend(パス、クエリ、またはフラグメント内)。それを除外したい場合(平衡したペアの一部でない場合)、より多くのロジックを適用する必要があります。