2012-03-28 7 views
1

文字列内の既存のURLをチェックする関数が必要です。ほとんどのURLにマッチする正規表現正規表現が改善する必要があります

function linkcleaner($url) { 
$regex="(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))"; 

if(preg_match($regex, $url, $matches)) { 
echo $matches[0]; 
} 
} 

正規表現は、彼がすべてのURLにマッチする正規表現を作成する問題に対処John Gruber's blog、から取られています。 残念ながら、私はそれを動作させることはできません。問題は正規表現の中の二重引用符や式の最後にある他の句読記号から来ているようです。 何か助けていただければ幸いです。 ありがとうございました!

+10

「それを動作させることはできません"組み込みのPHPエラーではありませんメッセージ。 –

+2

@JackManey、roflmao –

+0

申し訳ありませんが、エラーは "Parse error:構文エラー、予期しない"、 "C:\ ... \ config.php on line ..."です。英語は母国語ではなく、時には私が何を言いたいのかを説明するのに問題があります。 – olegb3

答えて

2

@ tanduの答え以外に、PHPの正規表現の区切り文字も必要です。

最も簡単にその文字が表示されないよう#であなたのパターンを開始し、終了し、次のようになります。

$regex="#(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'\".,<>?«»“”‘’]))#"; 
+0

"#"(アンカーを指定する)の一部である可能性があるので、デリミットする私の答えを編集しました... – poncha

+0

ありがとう!どのように私はそれを逃すことができます...私の日を保存しました:) – olegb3

+0

@ponchaこの正規表現のパターンで表示されません、それはここで重要な唯一のものです。 – jeroen

3

あなたは\

1

ジャックManeyさんのコメント... EPICと"エスケープする必要があります:あなたが途中で文字列リテラルの権利を終了しているためD

より深刻なノートでは、それは動作しません。 。

文字列に二重引用符(")を含めるには、あなたがそう\

を使用して、それをエスケープする必要があり、行は、私は(')を逃れてきた

$regex="/(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'\".,<>?«»“”‘’]))/"; 

お知らせになります同じように。これは、2つの単一引用符の間に文字列を定義する場合です。

+0

ありがとう&@tandu 私はまだエラーが発生します。警告:preg_match()[function.preg-match]:不明な修飾子 '\'がC:\ wamp \ www \ ... \ config.phpにあります。919 – olegb3

+0

PHPで、正規表現の先頭と末尾を同じ文字で区切る必要があると考えてください。私は '/' –

1

それはへの本当の痛みだ原因私は、あなたたちは、この正規表現を読んでどのように確認していません読み取り/変更...;)

)これは、はい、ワンライナーではありませんが、必要であれば、理解し、修正するのは簡単です(これを試してみてください。

<?php 
$re_proto = "(?:https?|ftp|gopher|irc|whateverprotoyoulike)://"; 
$re_ipv4_segment = "[12]?[0-9]{1,2}"; 
$re_ipv4 = "(?:{$re_ipv4_segment}[.]){3}".$re_ipv4_segment; 
$re_hostname = "[a-z0-9_]+(?:[.-][a-z0-9_]+){0,}"; 
$re_hostname_fqdn = "[a-z0-9_](?:[a-z0-9_-]*[.][a-z0-9]+){1,}"; 
$re_host = "(?:{$re_ipv4}|{$re_hostname})"; 
$re_host_fqdn = "(?:{$re_ipv4}|{$re_hostname_fqdn})"; 
$re_port = ":[0-9]+"; 
$re_uri = "(?:/[a-z0-9_.%-]*){0,}"; 
$re_querystring = "[?][a-z0-9_.%&=-]*"; 
$re_anchor = "#[a-z0-9_.%-]*"; 
$re_url = "(?:(?:{$re_proto})(?:{$re_host})|{$re_host_fqdn})(?:{$re_port})?(?:{$re_uri})?(?:{$re_querystring})?(?:{$re_anchor})?"; 

$text = <<<TEXT 
http://www.example.com 
http://www.example.com/some/path/to/file.php?f1=v1&f2=v2#foo 
http://localhost.localdomain/ 
http://localhost/docs/??? 
www....wwhat? 
www.example.com 
ftp://ftp.mozilla.org/pub/firefox/latest/ 
Some new Mary-Kate Olsen pictures I found: the splendor of the Steiner Street Picture of href… http://t.co/tJ2NJjnf 
TEXT; 

$count = preg_match_all("\01{$re_url}\01is", $text, $matches); 
var_dump($count); 
var_dump($matches); 
?> 
+0

あなたの答えはgreateです!それは、次の文字列を正しく解析する唯一の正規表現です: 'RT @JustBrelieve:" @ enn4xor:#TBT昨夏。 * _ * http://t.co/LsasKwfe"かわいい、かわいいよ。' – Oleg

+0

私はいくつかの問題' $ re_hostname_fqdn'パラメータを見つけました。それは 'メアリー・ケイト'のURLと '私が見つけた新しいメアリー・ケイト・オルセンの写真:http:// t.co/tJ2NJjnf' – Oleg

+0

@Oleg' $ re_hostname_fqdn'にマッチするそれは可能性の高いホスト名(任意の単語として...)だから、なぜ、それはprotitとwitoutに一致しているので、私はそれを見てみましょう気づいていただきありがとうございます – poncha