0

コード:

    $pattern = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
    $urls = array();
    preg_match($pattern, $comment, $urls);

    return $urls;

オンラインの正規表現テスターに​​よると、この正規表現は正しく、機能するはずです。

http://regexr.com?35nf9

以下を使用して $links 配列を出力しています。

$linkItems = $model->getLinksInComment($model->comments);
//die(print_r($linkItems));
echo '<ul>';
foreach($linkItems as $link) {
    echo '<li><a href="'.$link.'">'.$link.'</a></li>';
}
echo '</ul>';

出力は次のようになります。

$model->comments は次のようになります。

destined for surplus
RT#83015
RT#83617
http://google.com
https://google.com
non-link

生成されたリストはリンクのみを想定しており、空の行があってはなりません。正規表現が正しいように見えるので、私がしたことに何か問題がありますか。

4

2 に答える 2

0

コメントは複数行で構成されており、その中には関心のある URL だけが含まれているものもあります。この場合、完全なコメント テキストから URL を選択しようとするために、正規表現の災害に少し似ているものを使用する必要はありません。代わりに、改行で分割し、各行を個別に調べて、URL が含まれているかどうかを確認できます。したがって、次のように、より信頼性の高いものを実装できgetLinksInComment()ます。

function getLinksInComment($comment) {
    $links = array();
    foreach (preg_split('/\r?\n/', $comment) as $line) {
        if (!preg_match('/^http/', $line)) { continue; };
        array_push($links, $line);
    };
    return $links;
};

むき出しの関数ではなく、オブジェクト メソッドとして機能するように適切に調整することで、問題が完全に解決され、1 日を自由に過ごすことができます。

于 2013-07-25T20:23:52.960 に答える