【发布时间】:2013-03-16 15:46:36
【问题描述】:
为什么这个 preg_replace 不起作用?
仅供参考,我将 PHP 脚本设置为没有 BOM 的 UTF8,并且我将此处的函数设置为删除模式的所有匹配项(而不是我实际要做的,即删除所有不匹配项),因为这样更容易供测试用。另请注意,ā 字符不在我的正则表达式中,所以这应该是唯一留下的字符。
$string='The Story of Jewād';
echo preg_replace('@([!"#$&’\(\)\*\+,\-\./0123456789:;<=>\?ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_‘abcdefghijklmnopqrstuvwxyz\{\|\}~¡¢£⁄¥ƒ§¤“«‹›fifl–†‡·¶•‚„”»…‰¿`´ˆ˜¯˘˙¨˚¸˝˛ˇ—ÆªŁØŒºæıłøœß÷¾¼¹×®Þ¦Ð½−çð±Çþ©¬²³™°µ ÁÂÄÀÅÃÉÊËÈÍÎÏÌÑÓÔÖÒÕŠÚÛÜÙÝŸŽáâäàåãéêëèíîïìñóôöòõšúûüùýÿž€\'])@u','',$string);
我得到的结果是 $string 不变。为什么会这样?
【问题讨论】:
-
尝试使用
\pL+,而不是单独重新列出重音字母。 -
可能不是更容易做一个匹配你想要允许的字符的正则表达式,而不是列出所有那些不允许的字符。此外,对于数字,您可以使用
\d,对于连续范围,您可以使用A-Z之类的东西。这将使表达式更短且更易于管理。 -
@Spudley,是的,这就是我正在做的事情。上面的例子是为了方便测试而倒过来的。
-
@mario,我不能使用
\pL+,因为这个列表是特定的。这是我可以在我正在使用的特定字体中使用的所有字符。
标签: php regex utf-8 preg-replace