2016-06-30 21 views
0

テキスト内に「http」と「https」と「email」が必要です。次のテキストでPHP定期的にURLとメールを検索します

$regex = "((https|ftp)\:\/\/)"; // http and https 
    $regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)[email protected])"; // email 

    if(preg_match("/^$regex$/", $comment)) 
    { 
     $r = 'find'; 
    } else { 
     $r = 'not find'; 
    } 

を:私が試してみました

$comment = 'hello https:// and hello email [email protected]' 

しかし、それは動作しません。おそらく間違った分割のためです。

if (filter_var($comment, FILTER_VALIDATE_EMAIL)) { 
     return new \Exception('exist url'); 
    } 

が、私はコメントフィルターで唯一の電子メールを持っている場合、それが動作すると「ハロー[email protected]」、そうでない私が持っている場合は、このメールを見つけた:

は、私はこのようなフィルタを試してみました電子メールを見つける。フィルタFILTER_VALIDATE_URLについては

- それはこのようであれば、それは、URLを見つけることができません「ハローERLます。https:こんにちは\」

いくつかのテキストにURLやメールを見つけるために、右の正規表現を書くためにどのように?この行で

+0

あなたの正規表現の始めに '^'は、行の先頭でマッチを開始することを意味します。したがって、電子メール/ URLの前に他のコンテンツがある場合は、使用しないでください。同じものがパターンの最後の '$'に有効です - 開始点ではなく行の終わりにマッチするだけです。 –

答えて

2

if(preg_match("/^$regex$/", $comment)) 

あなたが^$regex$を持っています。 ^は、行の先頭でのみ一致することを意味します。 $は最後に一致することを意味します。そのため、この行にしか含まれていない場合はのみが含まれています。

これを削除して、行の任意の場所に一致するものを取得します。

if(preg_match("/$regex/", $comment)) 

しかし、あなたが探しているマッチングを提供するライブラリを探してみることをお勧めします。ライブラリには、エッジケースや簡単に見逃してしまったことをカバーするために、さらに多くのテストが行​​われます。

関連する問題