我是正确英语的坚持者(是的,我知道“坚持”和“正确”是矛盾的)。我已经创建了一个 CMS 用于我公司的网站,但有一件事让我很紧张——在已发布的内容中创建“智能”引用。
我有一个 reg-ex 可以做到这一点,但是当我在副本中遇到 html 标签时遇到了问题。例如,我的 CMS 使用的一个已发布故事可能包含一堆纯文本和一些 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;
}
就像我说的,我知道代码很难看,我愿意接受更优雅的解决方案。它可以工作,但在未来,如果出现不可预见的标签,它就会崩溃。作为记录,我想重申一下,我并不是想用正则表达式来解析 html 标签。我试图让它在解析字符串中的所有其余文本时忽略它们。
有什么解决办法吗?我做了很多在线搜索,但似乎找不到解决方案,而且我对 PHP 的正则表达式实现不够熟悉,这令人震惊。