2017-07-04 14 views
0

次の2つのことを同時に満たすコードを作成したいと思います。どうすれば自動リンクとhtmlspecialcharsの変換を同時に行うことができますか?

  1. テキストにURLが含まれている場合、その部分は自動的に<a href ~ class='temp_class'>リンクに変換されます。

  2. 上記の関数で生成された部分を除いて、テキストのhtmlエンティティ文字にfunc1()を適用します。 (これは、悪意のあるスクリプトによる攻撃を防ぐためです。)

は、だから私は、次のコードを書きました:私は上記のコードを実行したときに

<?php 
    function func1($text) //function like htmlspecialchars 
    { 
     $text = str_replace("&", "&#38;", $text); 
     $text = str_replace("\"", "&#34;", $text); 
     $text = str_replace("'", "&#39;", $text); 
     $text = str_replace("<", "&#60;", $text); 
     $text = str_replace(">", "&#62;", $text); 
     $text = str_replace(" ", "&nbsp;", $text); 
     return $text; 
    } 
    function func2($text) 
    { 
     $text = func1($text); 
     $url_pattern = "(http|https):\/\/([a-zA-Z0-9.\/?&=%[email protected]~:#$]+)"; 
     $text = preg_replace("/(".$url_pattern.")/i", "<a href='\\1' target='_blank' class='temp_class'>\\1</a>", $text); 
     return $text; 
    } 
    $test_string ="hello universe! https://www.youtube.com/watch?v=test  <iframe src='https://youtube.com/watch?v=good'></iframe> hello world."; 
    echo func2($test_string); 
?> 

をしかし、「あまりにも広く」適用されます。 つまり、 'https://www.~'(...) '〜hello world'は '単一リンク'として扱われます。 https://youtube.com/watch?v=good

  • <>'に適用されるhttps://www.youtube.com/watch?v=test

  • <a href ~ class='temp_class'>に適用され、このテキストでetc.が適切に変換され

    1. <a href ~ class='temp_class'>:私は何を望むか

      は三つのことでした〜によってfunc1()。だから<iframe ~ ></iframe>タグが動作しません。

    1と2が正常に動作していません。

    これはなぜ起こっているのでしょうか。おそらく、func1()<>etc.&#60;&#62;は、func2()etc.ので、正規表現がURLの一部としてそれらを解釈するに変身します。

    私は理由を推測することができますが、私は今何をすべきか分かりません。

    $url_patternfunc2()にいくつかの単語を追加して、%nbsp;&#60;などの文字を除外することを検討しています。しかし、正規表現でこれを表現する方法も私にとって大きな障害です。

    私はこの問題に長い時間を費やしましたが、非常に困難です。私を助けてください。

    理解できないことがあればコメントをお寄せください。例えば"hello"次の文字が正規表現で許可されている&た後 -

  • +0

    'htmlspecialchars'を使用して、あなた自身を記述しないでください。あなたのリンカーのためのいくつかのより良いユースケースを与えることができますか? [既存の実装](https://getcomposer.org)を探しましたか? – tadman

    +0

    これはあなたが望む出力ですか? 'hello  宇宙!   https://www.youtube.com/watch?v=test           < IFRAME SRC =   ' https://youtube.com/watch?v=good ' > </IFRAME >  ハロー  world.' – sln

    答えて

    1

    問題は、あなたのfunc1()&nbsp;内のすべてのスペースを変換し、正規表現は結果であっ見えるときに、それは休憩に見ているということです。

    HTMLエスケープを実行する前にURLキャプチャ正規表現を実行し、後でHTMLエスケープを実行する必要があります。

    BTW - 自分のカスタム関数の代わりにhtmlspecialchars()を使用してください - @tadmanが指摘しているとおりです。その1つの主な利点は、htmlspecialchars()はスペースを変換しないため、記述した問題が発生しないこと、またスペースを改行しないスペースに変換することは一般的には良い考えではないことです。

    0

    私はあなたがこれを試すことができると思います。 URL内のエンティティに対する警備員。 (余分な改行間隔で)

    Formatted regex

    (https?)     # (1) 
    : // 
    (       # (2 start) 
         (?: 
          (?! 
           (?i) 
           (?: 
            & 
            (?: 
              [a-z_:] [a-z\d_:.-]* 
             | (?: 
               \# 
               (?: [0-9]+ | x [0-9a-f]+) 
             ) 
            ) 
            | % [a-z_:] [a-z\d_:.-]* 
           ) 
           ; 
          ) 
          [a-zA-Z0-9./?&=%[email protected]~:#$] 
        )+ 
    )        # (2 end) 
    

    PHPの
    http://sandbox.onlinephpfunctions.com/code/0bba1854a960c00d4946b9cdaa9cca2ca2e447fc

    <?php 
        function func1($text) //function like htmlspecialchars 
        { 
         $text = str_replace("&", "&#38;", $text); 
         $text = str_replace("\"", "&#34;", $text); 
         $text = str_replace("'", "&#39;", $text); 
         $text = str_replace("<", "&#60;", $text); 
         $text = str_replace(">", "&#62;", $text); 
         $text = str_replace(" ", "&nbsp;", $text); 
         return $text; 
        } 
        function func2($text) 
        { 
         $text = func1($text); 
         $url_pattern = "(http|https):\/\/((?:(?!(?i)(?:&(?:[a-z_:][a-z\d_:.-]*|(?:\#(?:[0-9]+|x[0-9a-f]+)))|%[a-z_:][a-z\d_:.-]*);)[a-zA-Z0-9.\/?&=%[email protected]~:#$])+)"; 
         $text = preg_replace("/(".$url_pattern.")/i", "<a href='\\1' target='_blank' class='temp_class'>\\1</a>", $text); 
         return $text; 
        } 
        $test_string ="hello universe! https://www.youtube.com/watch?v=test  <iframe src='https://youtube.com/watch?v=good'></iframe> hello world."; 
        echo func2($test_string); 
    

    出力

    hello&nbsp;universe!&nbsp; 
    
    <a href='https://www.youtube.com/watch?v=test' target='_blank' class='temp_class'> 
    https://www.youtube.com/watch?v=test 
    </a> 
    
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;iframe&nbsp;src=&#39; 
    
    <a href='https://youtube.com/watch?v=good' target='_blank' class='temp_class'> 
    https://youtube.com/watch?v=good 
    </a> 
    
    &#39;&#62;&#60;/iframe&#62;&nbsp;hello&nbsp;world. 
    
    関連する問題