次の2つのことを同時に満たすコードを作成したいと思います。どうすれば自動リンクとhtmlspecialcharsの変換を同時に行うことができますか?
テキストにURLが含まれている場合、その部分は自動的に
<a href ~ class='temp_class'>
リンクに変換されます。上記の関数で生成された部分を除いて、テキストのhtmlエンティティ文字に
func1()
を適用します。 (これは、悪意のあるスクリプトによる攻撃を防ぐためです。)
は、だから私は、次のコードを書きました:私は上記のコードを実行したときに
<?php
function func1($text) //function like htmlspecialchars
{
$text = str_replace("&", "&", $text);
$text = str_replace("\"", """, $text);
$text = str_replace("'", "'", $text);
$text = str_replace("<", "<", $text);
$text = str_replace(">", ">", $text);
$text = str_replace(" ", " ", $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.
が適切に変換され
<a href ~ class='temp_class'>
:私は何を望むかは三つのことでした〜によって
func1()
。だから<iframe ~ ></iframe>
タグが動作しません。
1と2が正常に動作していません。
これはなぜ起こっているのでしょうか。おそらく、func1()
は<
、>
、etc.
は<
、>
は、func2()
でetc.
ので、正規表現がURLの一部としてそれらを解釈するに変身します。
私は理由を推測することができますが、私は今何をすべきか分かりません。
$url_pattern
にfunc2()
にいくつかの単語を追加して、%nbsp;
や<
などの文字を除外することを検討しています。しかし、正規表現でこれを表現する方法も私にとって大きな障害です。
私はこの問題に長い時間を費やしましたが、非常に困難です。私を助けてください。
理解できないことがあればコメントをお寄せください。例えば"hello"
次の文字が正規表現で許可されている&
た後 -
'htmlspecialchars'を使用して、あなた自身を記述しないでください。あなたのリンカーのためのいくつかのより良いユースケースを与えることができますか? [既存の実装](https://getcomposer.org)を探しましたか? – tadman
これはあなたが望む出力ですか? 'hello 宇宙! https://www.youtube.com/watch?v=test < IFRAME SRC = ' https://youtube.com/watch?v=good ' > </IFRAME > ハロー world.' – sln