-1

次の正規表現を使用して、テキスト内のリンクをクリック可能なリンクに置き換えています。

preg_replace('/(http)+(s)?:(\/\/)((\w|\.)+)(\/)?(\S+)?/i', '<a href="\0" target="_blank" class="lgray">\0</a>',$message);

www で始まるリンクと http で始まるリンクのみを認識する新しいリンクが必要です。必要な URL タイプのリストを次に示します。

私は自分でやろうとしましたが、正規表現はあまり得意ではありません。どんな助けにも感謝します。

ありがとうございました!

PS: また、stackoverflow は www で始まる URL のみを認識しません。

4

4 に答える 4

0

正規表現では、コロンと 2 つのスラッシュを必須にしています。

この行は次のことを修正する必要があります。

preg_replace('/(http|https)?(:)?(\/\/)?((\w|\.)+)(\/)?(\S+)?/i', '<a href="\0" target="_blank" class="lgray">\0</a>',$domains);

より良い答えを得るには、http://www の有無にかかわらず URL に一致する正規表現パターンを調べてみてください。

于 2012-06-07T09:24:57.257 に答える
0

Claus Witt のリンクを使用し、それを少し変更するだけでうまくいきました。彼が与えた preg_replace は機能しませんでした。これが私がしたことです:

$regex = "(((https?|ftp)\:\/\/)|(www))";//Scheme
$regex .= "([a-z0-9-.]*)\.([a-z]{2,4})";//Host or IP
$regex .= "(\:[0-9]{2,5})?";//Port
$regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?";//Path
$regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?";//GET Query
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?";//Anchor
return str_replace
(
    array('href="','http://http://','http://https://','http:///'),
    array('href="http://','http://','https://','/'),
    preg_replace('/'.$regex.'/i','<a href="\0" target="_blank" class="lgray">\0</a>',$message)
);

変更では、httpまたはwwwを必須にし、不要なチェックをいくつか削除し、ドメイン拡張子を 3 文字から 4 文字に拡張しました (.info もドメインです)。

于 2012-06-07T10:15:35.437 に答える
0

免責事項: これらは非常に基本的なものであり、有効な TLD やファイル拡張子のチェックには対応していません。自己責任。

ディレクトリやファイルを考慮する必要がないと仮定すると、サブドメインなしでこれらのベース URL のみを照合するには、次の正規表現を使用できます

(?<=^|[\n\s])(?:https?:\/\/)?(?:www\.)?[a-zA-Z0-9-.]+\.com\/?(?=$|[\n\s])
#DESCRIPTION::
#  (?<=^|[\n\s])           Checks to see that what's preceding the URL is the beginning of the string, or a newline, or whitespace.
#  (?:https?:\/\/)?        Matches http(s) if it is there
#  (?:www\.)?              Matches www. if it is there
#  [a-zA-Z0-9-]+           Matches "example" in "example.com" (as well as any other valid URL character; will also match subdomains)
#  \.com\/?                Matches .com(/)
#  (?=$|[\n\s])            Checks to see that what's following the URL is the end of the string, or a newline, or whitespace.

ディレクトリとファイルも一致させる必要がある場合は、正規表現の末尾を変更して、わずかに追加する必要があります

(?<=^|[\n\s])(?:https?:\/\/)?(?:www\.)?[a-zA-Z0-9-.]+\.com(?:(?:\/[\w]+)+)?(?:\/|\.[\w]+)?(?=$|[\n\s])
#DESCRIPTION::
#  (?<=^|[\n\s])           Checks to see that what's preceding the URL is the beginning of the string, or a newline, or whitespace.
#  (?:https?:\/\/)?        Matches http(s) if it is there
#  (?:www\.)?              Matches www. if it is there
#  [a-zA-Z0-9-.]+          Matches "example" in "example.com" (as well as any other valid URL character; will also match subdomains)
#  \.com                   Matches .com
#  (?:                     Start of a group
#     (?:\/[\w]+)+         Attempts to find subdirectories by matching /, then word characters
#  )?                      Ends the previous group. This group can be skipped, if there are no subdirectories
#  (?:\/|\.[\w]+)?         Matches a file extension if it is there, or a / if it is there.
#  (?=$|[\n\s])            Checks to see that what's following the URL is the end of the string, or a newline, or whitespace.
于 2012-06-07T22:15:28.297 に答える
-1

これを試してください:

$pattern = preg_replace("/((https:\/\/|http:\/\/||http:\/\/www.|https:\/\/www.|www.)+([\w\/])+(.com\/|.com))/i","<a target=\"_blank\" href=\"$1\">$1</a>",$url);
于 2012-06-07T10:08:12.690 に答える