2017-10-19 11 views
-1

文字列内のURLを識別する目的のコードを継承していますが、存在しない場合はhttp://プロトコルの前に追加してください。php regex preg_replace_callback

return preg_replace_callback(
     '/((https?:\/\/)?\w+(\.\w{2,})+[\w?&%=+\/]+)/i', 
     function ($match) { 
      if (stripos($match[1], 'http://') !== 0 && stripos($match[1], 'https://') !== 0) { 
       $match[1] = 'http://' . $match[1]; 
      } 
      return $match[1]; 
     }, 
     $string); 

ドメインにハイフンがある場合を除いて動作しています。したがって、インスタンスの場合、次の文字列は部分的にしか動作しません。

$string = "In front mfever.com/1 middle http://mf-ever.com/2 at the end"; 

どのような正規表現の天才に間違いがありますか?

+1

'\ w'は文字、数字、' _'のみに一致します。許可された文字で文字クラスを使用する必要があります。 '[\ w-] 'もハイフンにマッチすると言ってください。 –

+0

提供されているソリューションのいずれかが機能している場合は、必ずそれを受け入れてください。 – mega6382

答えて

0

は、あなただけのオプションのダッシュを追加する必要があります。

((https?:\/\/)?\w+\-?\w+(\.\w{2,})+[\w?&%=+\/]+) 

が、それはここhttps://regex101.com/r/Tkdapj/1

+0

ハイフンが2つ以上存在すると正規表現が壊れます。 – mega6382

+0

tweaked https://regex101.com/r/Tkdapj/2 – delboy1978uk

0

動作し、次の正規表現を試してみてください:

'/((https?:\/\/)?[\w-]+(\.\w{2,})+[\w?&%=+\/]+)/i', 

これはあまりにも-が含まれます。 DEMO