【问题标题】:PHP preg_replace with UTF-8 not working使用 UTF-8 的 PHP preg_replace 不起作用
【发布时间】: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


【解决方案1】:

这是反向的:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
<?php 

$string='The Story of Jewād';
echo preg_replace('@([ā])@','',$string);

?>

所以,只是某处存在语法问题...... 将所有字符都列为 RegExp 并不是一个好主意。你可以这样做:

ltrChars : 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF'+'\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF';
rtlChars : '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC';

【讨论】:

  • 我需要专门列出所有字符,因为这些是我在字体中拥有的所有字符。
  • 好吧,至少我可以看到一些范围;像 A-Z 或 0-9
  • 您的方法在这里并不完全有效,但稍作改动后它确实有效:@([^\x{0020}-\x{007E}\x{FB01}\x{FB02}\x{00A1}-\x{00AC}\x{00AE}-\x{00FF}\x{0160}\x{0161}\x{0192}\x{2013}\x{2018}-\x{201A}\x{2020}-\x{2022}\x{2026}\x{2030}\x{2039}\x{2044}\x{201C}-\x{201E}\x{203A}\x{02C6}\x{02D8}-\x{02DD}\x{02C7}\x{2014}\x{0141}\x{0142}\x{0131}\x{0152}\x{0153}\x{2212}\x{2122}\x{0178}\x{017D}\x{017E}\x{20AC}])@u
猜你喜欢
  • 2019-01-30
  • 2015-08-06
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 2014-06-15
  • 2013-01-29
  • 2013-07-19
相关资源
最近更新 更多