0

こんにちは、post_link($str) というこの関数に大きな問題があります。

<?php        
function post_link($str)
{
    if(preg_match("#(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?#",$str,$url)){

    return preg_replace("#(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?#","<a href='$0'>$0</a>",$str);
    } 
    else
    {
        return $str;
    }
}      

?>

私が望むようにリンクを作成しませんか?

これは、このリンクへのリンクを作成したいときに行うことです。

youtube.com/watch?v=4EvNxWhskf8 

結果はこれです

href='http://youtube.com/watch?v=4EvNxWhskf8'>youtube.com/watch?v=4EvNxWhskf8 

これが起こる原因は何ですか?助けてください。href 属性が表示される理由。

4

2 に答える 2

0

まず、置換前に文字列がパターンに一致するかどうかをテストするのは役に立ちません... 文字列が一致しない場合、 preg replace は置換しません。

これで十分です:

function post_link ($str){
    return preg_replace("...", $str)
}

また、デバッグが容易になります。

次に、ここに私のテストがあります:

[ ~]$ cat script.php 
#!/usr/bin/php
<?php
    echo preg_replace("#(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?#","<a href='$0'>$0</a>", $argv[1]) . "\n";
?>
[ ~]$ ./script.php "http://youtube.com/watch?v=4EvNxWhskf8"
<a href='http://youtube.com/watch?v=4EvNxWhskf8'>http://youtube.com/watch?v=4EvNxWhskf8</a>
[ ~]$ 

期待どおりの結果ですね。そのため、さらにデバッグする必要があります (たとえば、xdebug などのデバッガーで変数を調べます)。それ以外の場合は、コード、出力などの詳細をお知らせください...

さらに、リンクの例にはプロトコルが含まれていないことに注意してください(http://たとえば)。それが実際の例である場合、正規表現はこの文字列と一致しません...

于 2013-11-03T22:33:59.260 に答える
0

正規表現の一致は、()in パターンで定義されたサブパターンによって分割されます。したがって、パターン内のすべてのサブパターンに対して、部分一致が得られます。セット内の最初の一致は完全一致で、2 番目は最初の一致(expr)です ... などです。つまり、$0 = 完全一致文字列です。$1 = 'http' または 'https' または 'ftp' または 'ftps', $2 = '(/\S*)'.

したがって、式の適切な部分を に入れ()、置換文字列に正しい数値を与える必要があります。

于 2013-11-03T22:35:13.380 に答える