0

次のコードがこの URL を短縮しないのはなぜですか? そして、実際にクリック可能な URL に変換しないのはなぜですか? この関数は、これ以外のすべてのケースで機能するようです。

URL:

strongatheism.net/library/atheology/argument_from_noncognitivism/

コード:

function urlfixer($text){

   $pattern  = '#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#';
   $callback = create_function('$matches', '
       $url       = array_shift($matches);      
       $url_parts = parse_url($url);

       $text = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH);
       $text = preg_replace("/^www./", "", $text);

       $last = -(strlen(strrchr($text, "/"))) + 1;
       if ($last < 0) {
           $text = substr($text, 0, $last) . "&hellip;";
       }

        $url = "http://" . str_replace("http://","",$url);
       return sprintf(\'<a rel="nofollow" target="_blank" href="%s">%s</a>\', $url, $text);
   ');

   return preg_replace_callback($pattern, $callback, $text);
}
4

1 に答える 1

0

私はあなたの質問に答えるのに問題があります。

  1. 正規表現はそれをキャプチャしないためです。
  2. 関数のコンテキストでは有効な URL と見なされないためです。

それが適切に機能するためには、URL が何を構成するか (ここでは正規表現パターンの形式で) を適切に定義するか、独自の仕様で定義する必要があります (質問にはありません)。

複雑な正規表現を含む優れたコードには、正規表現が正確に何をするのかという記述が常に含まれています。このようなコメントは、有効な入力を修飾する小さな仕様としてもうまく機能します。コードは次のようになります ( YouTube ビデオ ID からの例):

$pattern = 
    '%^# Match any youtube URL
    (?:https?://)?  # Optional scheme. Either http or https
    (?:www\.)?      # Optional www subdomain
    (?:             # Group host alternatives
      youtu\.be/    # Either youtu.be,
    | youtube\.com  # or youtube.com
      (?:           # Group path alternatives
        /embed/     # Either /embed/
      | /v/         # or /v/
      | /watch\?v=  # or /watch\?v=
      )             # End path alternatives.
    )               # End host alternatives.
    ([\w-]{10,12})  # Allow 10-12 for 11 char youtube id.
    $%x'
    ;

あなたの質問には有効な URL を構成するものがない (未指定のまま) ため、仕様を追加するか、パターンを修正する (またはその両方) 以外に答える必要はありません。

ただし、2 番目の質問は、より簡単に答えることができます。

そして、実際にクリック可能な URL に変換しないのはなぜですか?

捕まらないからです。

于 2013-04-10T12:07:11.257 に答える