0

これが私のコードです:

$post = $_POST['test'];
$pattren='/((([http]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\/+=&#?;%@,.\w_]*)#?(?:[\w]*)?))/';
preg_match_all( $pattren, $post, $matches);

foreach($matches[0] as $match) {
    $images[]= "<a href=\"$match\" target=\"_blank\" >$match</a> ";
}

for ($i = 0, $c = count($images); $i < $c; $i++) {
    $html_links = str_replace($pattren,$images[$i], $post);
}

echo $html_links;

すべての URL を取得してリンクに変換しようとし$postていますが、何か問題があります。

4

2 に答える 2

2

このコードには、次のような多くの問題があります。

正規表現($pattren)がどこから来たのかはわかりませんが、私には完全にぎこちないように見えます。[http]{3,9}:つまり、「文字「h」、「t」、または「p」のいずれかを3〜9回繰り返した後、コロンで」-したがって、「thppppppt:」と一致します。これは、私にはURLの先頭とはあまり似ていません。

str_replace正規表現とは何の関係もないのでstr_replace($pattren, ...、入力でその正規表現のテキストを探しています。

実際に$matchは、文字列の正しい部分にすでにコピーされているため、そのループでどのような置換が発生すると予想されるかはわかりません。

$html_links2番目のループの前後で毎回変数を上書きしています。示されていないコードがない限り、2つのループも必要ありません。foreachループ内で文字列を作成し、$images配列を完全に削除することができます。

そして、ちなみに、あなたは「パターン」のつづりを間違え、中括弧に一貫性のない規則を使用し{ました。それ自体の行を好む人もいれば、for/の行を好む人もforeachいますが、それぞれを管理しました。[ただし、これらはどちらもコードに影響しません]

于 2012-08-18T16:29:18.740 に答える
0

preg_replace()を使用する

$post = $_POST['test'];
$pattren='%\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s';
$html_links = preg_replace($pattren, '<a href="$1" target="_blank">$1</a>', $post);
echo $html_links;

ここから良いパターンで更新されました。

于 2012-08-18T16:20:32.840 に答える