【问题标题】:Why is this php regex not processing accents?为什么这个 php 正则表达式不处理口音?
【发布时间】:2012-08-10 18:23:38
【问题描述】:

我知道有人问过before,但我仍然不明白为什么以下方法不起作用:

<?php
echo preg_replace('/(?:[?\p{L}]*\/)?(?:[?\w\-]*\/)?/', '$1', 'cafes/123456') . '<br />';
// '123456'

echo preg_replace('/(?:[?\p{L}]*\/)?(?:[?\w\-]*\/)?/', '$1', 'cafés/123456') . '<br />';
// 'café123456' where I expect 123456

echo preg_replace('/(?:[?\p{L}é]*\/)?(?:[?\w\-]*\/)?/', '$1', 'cafés/123456') . '<br />';
// '123456' thanks to the extra "é" after "\p{L}"
?>

\p{L} 不应该替换任何重音吗?

【问题讨论】:

  • 建议:由于您的模式在内部使用/,您应该使用一些分隔符,例如#。这减少了你必须做的逃跑量,并摆脱了\/\/\/\/倾斜牙签综合症。
  • 你的代码对我显示 123456 三次。

标签: php regex


【解决方案1】:

您缺少将字符串视为 UTF-8 的 u modifier

echo preg_replace('/(?:[?\p{L}]*\/)?(?:[?\w\-]*\/)?/u', '$1', 'cafes/123456') . '<br />';
// '123456'

echo preg_replace('/(?:[?\p{L}]*\/)?(?:[?\w\-]*\/)?/u', '$1', 'cafés/123456') . '<br />';
// '123456'

echo preg_replace('/(?:[?\p{L}é]*\/)?(?:[?\w\-]*\/)?/u', '$1', 'cafés/123456') . '<br />';
// '123456'

【讨论】:

  • 非常感谢,这个对我有用。我完全错过了u 修饰符。不知道为什么它对 Ondrej 有相反的作用......
猜你喜欢
  • 1970-01-01
  • 2014-02-25
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2013-12-05
相关资源
最近更新 更多