【问题标题】:i modifier doesn't work with foreign languages?i 修饰符不适用于外语?
【发布时间】:2010-08-24 09:49:22
【问题描述】:

我的字符串是外语的。我使用以下正则表达式:

$str = 'մի քանի Բառ ձեր մասին';
$word = 'բառ';

$cont = preg_match_all("/.{0,80}[^\s]*?".preg_quote($word)."[^\s]*?.{0,80}/si",$str,$matched);
print_r($matched);//returns Array ( [0] => Array ( ) ) ..

.

...但如果我设置:

$word = "Բառ";//returns Array ( [0] => Array ( [0] => մի քանի Բառ ձեր մասին ) )  

如何才能在外语中也使用 I 修饰符?

【问题讨论】:

  • 这段代码的目的是什么?您是否尝试从文本中提取单词以及周围的单词?
  • @Gumbo 完全正确。如果字符串中甚至有子词,我会尝试提取单词和周围的单词。您如何看待这样的解决方案?
  • 我宁愿将文本拆分成单词,找到属于或包含想要单词的单词,然后获取周围的单词。或者如果你想使用preg_match_all,只需搜索想要的单词并使用PREG_OFFSET_CAPTURE 标志来获取substr 的偏移量(参见stackoverflow.com/questions/3306513)。
  • 好的,但据我所知,如果我也使用PREG_OFFSET_CAPTURE 来获取偏移量,如果偏移量小于我提到的,它将返回大量结果。我对么?即,如果我设置offset=30但只有29个字符,它会返回空结果?

标签: php regex encoding modifier


【解决方案1】:

尝试添加u 修饰符:

$cont = preg_match_all("/.{0,80}[^\s]*?".preg_quote($word)."[^\s]*?.{0,80}/siu",$str,$matched);

【讨论】:

  • 完美。非常感谢。你能解释一下为什么 u 修饰符对语言有影响吗?据我所知,它只会反转贪婪?
  • @Syom: U(大写)用于非贪婪匹配,u(小写)用于将模式解释为 UTF-8 编码。见php.net/reference.pcre.pattern.modifiers
猜你喜欢
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多