【发布时间】:2023-03-15 06:58:01
【问题描述】:
我正在使用preg_replace 来匹配编码不正确的 UTF-8 字符并将其替换为正确的字符。我创建了一个包含错误字符的“旧”数组,以及一个带有替换的相应“新”数组。这是每个数组的一个sn-p:
$old = array(
'/â€/',
'/’/',
);
$new = array(
'†',
'’',
);
(注意:如果你对我这样做的原因感到好奇,read more here)
可能包含错误数据的示例字符串可能是:
The programmer’s becoming very frustrated
应该变成:
The programmer's becoming very frustrated
我正在使用这个功能:
$result = preg_replace($old, $new, $str);
但主题实际上正在变成:
The programmer†™s becoming very frustrated
很明显,PHP 正在对该主题进行我所说的非贪婪匹配(我知道,这里使用的术语不正确)。 preg_replace 正在对旧/新数组中的第一对执行替换,而不考虑模式数组中是否可能存在更合适的不同模式。如果我颠倒替换对的顺序,那么它会按预期工作。
我的问题是:有没有一种方法可以让preg_replace 在执行替换之前考虑模式数组的所有元素,还是我唯一的选择是重新排序数组?
【问题讨论】:
标签: php regex preg-replace