2

多くの Stackoverflow 正規表現の投稿を検索しましたが、答えが見つかりませんでした。$text以下を使用して、特定の文字列内のすべての URL を検索しています。

$pattern = "#((http|https|ftp|ftps)://)?([a-zA-Z0-9\-]*\.)+[a-zA-Z0-9]{2,4}(/[a-zA-Z0-9=.?&-]*)?#";

(より正確/効率的/...があるかもしれないことに同意しましたが、それは問題ではありません...まだ)。

このテキスト入力で:

$text = "Website: www.example.com, ";
$text .= "Contact us: http://www.example.com/cu?t=contactus#anchor, ";
$text .= "Email: contact@example.com";

次に、

preg_match_all($pattern, $text, $matches);

これらを返します:

www.example.com
http://www.example.com/cu?t=contactus
example.com

最後example.comはメールからのもので、除外できるようにしたいです。
の組み合わせを何度も試しましたが[^@](?!@)うまくいきませんでした。まだ電子メールの結果を受け取っています。

私ができる最善の方法は@、最初にオプションを含めて、それが返されるようにし@example.com、結果をループして、で始まるものを除外すること@です。

より良い解決策はありますか?電子メールである部分文字列を含まない単一のパターン?

4

1 に答える 1

1

アサーションなどの高度な機能を使用しないソリューションの例:

<?php

$text = 'ftp://web.com, ';
$text .= "Website: www.example.com, ";
$text .= "Contact us: http://www.example.com/cu?t=contactus#anchor, ";
$text .= "Email: contact@example.com";

$base = "((http|https|ftp|ftps)://)?([a-zA-Z0-9\-]*\.)+[a-zA-Z0-9]{2,4}(/[a-zA-Z0-9=.?&-]*)?";

$matches = array(); preg_match_all("#$base#", $text, $matches); var_dump($matches[0]);
$matches = array(); preg_match_all("#\s($base)#", " $text", $matches); var_dump($matches[1]);

?>

出力:

array(4) {
  [0]=>
  string(13) "ftp://web.com"
  [1]=>
  string(15) "www.example.com"
  [2]=>
  string(37) "http://www.example.com/cu?t=contactus"
  [3]=>
  string(11) "example.com"
}
array(3) {
  [0]=>
  string(13) "ftp://web.com"
  [1]=>
  string(15) "www.example.com"
  [2]=>
  string(37) "http://www.example.com/cu?t=contactus"
}

URL の前の空白をチェックするだけで、サブパターンには含めないでください。[^@]regex はマッチの残りの部分と単純にマッチeするため、使用は機能しません。それらは後で 1 つのマッチにマージされます。[^@]xample.com

于 2013-03-07T13:18:04.783 に答える