2012-04-02 149 views
1

好吧,我卡住了。 PHP,正則表達式。我有一個字符串:匹配由空格分隔的字母數字字符

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

而且我想使用的preg_replace()發佈包含拉丁文字母,數字和空格子與<b>標籤。子串不只是一個字,但只要下一個單詞包含拉丁字符集的話:

Этокириллические23個78these are56 45latin76字母here98 85буквы。

我最好的拍攝是:

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

但它抓住不僅是 「here98」,而且下面的 「85」:

Этокириллические23個78these are56 45latin76字母here98 85буквы。

我明白爲什麼它是如此,但未能弄清楚正確的正則表達式。

+0

你試過[A-z0-9]嗎? – hjpotter92 2012-04-02 21:22:56

+0

@TheJumpingFrog,[A-z0-9]不考慮空格。我需要像bla34 64bla而不是bla3464bla。 – 2012-04-02 21:30:50

+0

'([A-z0-9] | \ s)'會佔用空白嗎? – hjpotter92 2012-04-02 21:32:08

回答

1

您不僅需要匹配拉丁+數字的單詞,還要看前面的一個單詞和後面的單詞。 據我所知,可變長度看,屁股是不可能的,所以你應該使用非捕獲組(?:...)和積極的前瞻(?=...)

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

PS:AAAAH!俄羅斯黑手黨! ;-)

+0

哦,yesss。它工作,我的寶座。難怪在時間到了的時候我無法正確使用它們。實際上,我正在爲片假名/平假名/漢字完成這項任務,西裏爾字母和拉丁字母在示例中更容易使用。 Arigatou gozaimasu到俄羅斯黑手黨。 :-) – 2012-04-02 21:52:22

+0

@AriLinnどういたしまして – kirilloid 2012-04-02 21:58:08

相關問題