doujian3132 2012-04-02 21:19
浏览 124
已采纳

匹配用空格分隔的字母数字字符

Okay, I'm stuck. PHP, Regex. I have a string:

Это кириллические 23 78these are56 45latin76 letters here98 85 буквы.

And I want to use preg_replace() to enclose a substring containing latin letters, numbers and spaces with <b> tags. A substring is not merely a word but a set of words as long as the next word contains Latin characters:

Это кириллические 23 78these are56 45latin76 letters here98 85 буквы.

My best shot was:

$text = 'Это кириллические 23 78these are56 45latin76 letters here98 85 буквы.';
$regex = "/\d*\p{Latin}+(\d|\s|\p{Latin})*/iu";
preg_replace($regex, '<b>$0</b>', $text);

But it grabs not only "here98" but also the following "85":

Это кириллические 23 78these are56 45latin76 letters here98 85 буквы.

I understand why it is so but fail to figure out the correct Regex.

  • 写回答

1条回答 默认 最新

  • duan19850312 2012-04-02 21:31
    关注

    You need not just match Latin+digits words, but look one word ahead and one word behind. AFAIK, variable-length look-behinds are not possible, so you should use non-capturing group (?:...)and positive look-ahead (?=...):

    $regex = "/(?:[\p{Latin}\d]+ )([\p{Latin}\d ]+)(?= [\p{Latin}\d]+)/iu";
    preg_replace($regex, '<b>$1</b>', $text);
    

    PS: Aaaah! Russian mafia! ;-)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了