私は正しい英語に固執しています (はい、「固執する」と「正しい」が矛盾していることは知っています)。会社のサイトで使用する CMS を作成しましたが、公開されたコンテンツに「スマートな」引用を作成するという、非常に神経質になっていることが 1 つあります。
それを行う正規表現がありますが、コピーでhtmlタグに遭遇すると問題が発生します。たとえば、私の CMS で使用されている公開済みのストーリーの 1 つに、多数のプレーン テキストといくつかの HTML タグ (リンク タグなど) が含まれている場合があります。これには、明白な理由から「スマート」引用符に変更したくない引用符が含まれています。 .
15 年前、私は Perl RegEx エースでしたが、これには完全に空白を描いています。私がやりたいことは、html タグ内のすべてのテキストを無視して文字列を処理し、文字列内のすべての引用符を「スマート」引用符に置き換えてから、html タグをそのままにして文字列を返すことです。
私は CMS で直面する最も一般的なシナリオを処理するために一緒に詰め込んだ関数を持っていますが、それが見苦しく、まったく洗練されていないこと、および予期しないタグが表示された場合にソリューションが完全に壊れることが嫌いです。
コードは次のとおりです(笑わないでください。スコッチのボトル半分以上を一緒に叩きつけたものです)。
function educate_quotes($string) {
$pattern = array('/\b"/',//right double
'/"\b/',//left double
'/"/',//left double end of line
"/(\w+)'(\w+)/",//apostrophe
"/\b'/",//left single
"/'\b/",//right single
"/'$/",//right single end of line
"/--/"//emdash
);
$replace = array("”",//right double quote
"“",//left double
"”",//left double end of line
"$1"."’"."$2",//apostrophe
"’",//left single
"‘",//right single
"’",//right single end of line
"—"//emdash
);
$string = preg_replace($pattern,$replace,$string);
//remove smart quotes around urls
$string = preg_replace("/href=“(.+)”/","href=\"$1\"",$string);
//remove smart quotes around images
$string = preg_replace("/src=“(.+?)”/","src=\"$1\" ",$string);
//remove smart quotes around alt tags
$string = str_replace('alt=”"','',$string);
$pat = "/alt=“(.+?)”/is";
$rep = "alt=\"$1\" ";
$string = preg_replace($pat,$rep,$string);
//i'm too lazy to figure out why this artifact keeps appearing
$string = str_replace("alt=“",'alt="',$string);
//same thing here
$string = preg_replace("/” target/","\" target",$string);
return $string;
}
私が言ったように、私はコードが醜いことを知っており、より洗練されたソリューションに対してオープンです。動作しますが、将来、予期しないタグが来ると壊れます。記録のために、私は PARSE html タグへの正規表現を取得しようとしていないことを繰り返したいと思います。文字列内の残りのテキストをすべて解析しながら、それらを IGNORE にしようとしています。
解決策はありますか?私は多くのオンライン検索を行ってきましたが、解決策を見つけることができないようです.PHPの正規表現の実装に慣れていないため、驚くほどです.