1

たとえば、文字列の出現を変更しhttp://www.bbc.co.uk/て、html リンク内に表示されるようにしようとしています。<a href="http://www.bbc.co.uk/">http://www.bbc.co.uk</a>

ただし、何らかの理由で正規表現変換が機能しません。誰かが私を正しい方向に向けることができますか?

$text = "I love this website http://www.bbc.co.uk/";
$x = preg_replace("#[a-z]+://[^<>\s]+[[a-z0-9]/]#i", "<a href=\"\\0\" target=\"_blank\">\\0</a>", $text);
var_dump($x);

私はこのウェブサイトが大好きですhttp://www.bbc.co.uk/(HTML リンクなし)

4

3 に答える 3

1

あなたの奇妙な文字クラスに問題があります:

 [[a-z0-9]/]

二重角括弧は、 などの POSIX 文字クラス用です[[:digit:]]

あなたはただ書くつもりでした:

 [a-z0-9/]
于 2013-01-18T00:26:09.853 に答える
0

これを使って:

$x = preg_replace('#http://[?=&a-z0-9._/-]+#i', '<a target="_blank" href="$0">$0</a>', $text);
于 2013-01-18T00:27:41.083 に答える
0

これは、正規表現が一致しているためです (実際、ドメイン名にピリオドをまったく受け入れていないため、実際には一致に近づいていません)。次のようなことを試してください:

$pattern = '#https?://.*\b#i';
$replace = '<a href="$0" target="_blank">$0</a>';
$x = preg_replace($pattern, $replace, $text);

ここで実際に URL 形式を検証しようとしているわけではないことに注意してください。したがって、http():// のようなものを次の単語境界まで受け入れるだけです。いずれにせよ、真の URL 検証正規表現 (つまり、少なくとも 1 つ.の があること、TLD コンポーネントに 2 ~ 6 文字があることなどを検証すること) を求めているようには見えなかったので、最も簡単な方法を紹介します。合いそうなパターン。

于 2013-01-18T00:29:53.433 に答える