2011-01-19 33 views
7

如何在PHP中匹配俄文字符串(也是俄文)中的俄文單詞?如何匹配在PHP中使用preg_replace的俄語單詞?

因此,例如,這樣的事情:

$pattern = '/слово/'; 
preg_replace($pattern, $replacement, $string_in_russian) 

我試圖utf8_encodehtmlentities使用UTF-8標誌$模式,但沒有奏效。我是否也應該編碼$ string_in_russian?

更新:對/ u標誌的建議不起作用,所以我把我需要這個的實際代碼。它來自Wordpress的詞彙插件(我的站點已正確設置爲使用俄語,並且確實有效,但在此情況下不起作用)。因此,這裏的代碼

$glossary_title = $glossary_item->post_title; 
$glossary_search = '/\b'.$glossary_title.'s*?\b(?=([^"]\*"[^"]\*")\*[^"]*$)/iu'; 
$glossary_replace = '<a'.$timestamp.'>$0</a'.$timestamp.'>'; 
$content_temp = preg_replace($glossary_search, $glossary_replace, $content, 1); 

當我做一個快速的回聲到HTML註釋這是一種字符串,我得到的模式
/\bсловоs*?\b(?=([^"]*"[^"]")[^"]*$)/iu

和好了,這似乎仍然沒有工作。我想也許是因爲這個「s」讓我搞砸了(這個級別的正則表達式有點超出我的意思,但我認爲它存在可能的複數形式),但刪除它並沒有幫助。

更新#2:好吧,所以我決定做一個完整的「空白石板」測試 - 簡單的PHP文件,用英文和俄文的一些$內容字符串和目標文字替換。下面是代碼

$content_en = 'Nulla volutpat pretium nunc, ac feugiat neque lobortis vitae. In eu sapien sit amet eros tincidunt viverra. <b style="color:purple">Proin</b> congue hendrerit felis, et consequat neque ultrices lobortis. <b style="color:purple">Proin</b> luctus bibendum libero et molestie. Sed tristique lacus a urna semper eget feugiat lacus varius. Donec vel sodales diam. <b style="color:purple">Proin</b> fringilla laoreet purus, a facilisis nisi porttitor vel. Nullam ac justo ac elit laoreet ullamcorper vel a magna. Suspendisse in arcu sapien.'; 
$find_en = 'proin'; 
$replace_with_en = '<em style="color:red">REPLACEMENT</em>'; 
$glossary_search = '/\b'.$find_en.'s*?\b(?=([^"]*"[^"]*")*[^"]*$)/iu'; 
$content_en_replaced = preg_replace($glossary_search, $replace_with_en, $content_en); 

$content_ru = 'Lorem Ipsum используют потому, что тот обеспечивает более или менее стандартное заполнение шаблона, а также реальное распределение букв и пробелов в абзацах, которое не получается при простой дубликации "Здесь <b style="color:purple">ваш</b> текст.. Здесь <b style="color:purple">ваш</b> текст.. Здесь <b style="color:purple">ваш</b> текст.." Многие программы электронной вёрстки и редакторы HTML используют Lorem Ipsum в качестве текста по умолчанию.'; 
$find_ru = 'ваш'; 
$replace_with_ru = '<em style="color:red">Многие</em>'; 
$glossary_search = '/\b'.$find_ru.'s*?\b(?=([^"]*"[^"]*")*[^"]*$)/iu'; 
$content_ru_replaced = preg_replace($glossary_search, $replace_with_ru, $content_ru); 

這裏是輸出http://www.flickr.com/photos/iliadraznin/5372578707/

正如你可以看到英文文本有目標單詞替換的截圖,而俄羅斯還沒有與代碼是相同的,我使用/ u標誌。該文件也是UTF-8編碼的。有什麼建議麼? (再次,我試圖刪除「S」,仍然沒有)

+2

在蘇聯,俄羅斯字正則表達式匹配YOU! – goat 2011-01-20 18:02:24

回答

7

如果你做了一個真正的空白石板測試,你會發現沒有什麼錯的俄羅斯 - 它實際上是打破正則表達式的字邊界方面。

$glossary_search = '/'.$find_ru.'/iu'; // Works fine 
$glossary_search = '/\b'.$find_ru.'\b/iu'; // Breaks 

字邊界的簡寫是不是UTF-8瞭解,所以,每一個問題:php regex word boundary matching in utf-8你可以嘗試以下方法:

$glossary_search = '/(?<!\pL)'.$find_ru.'(?!\pL)/iu'; 

,這裏對我的測試工作正常。

1

對於初學者,您必須確保您的PHP文件編碼爲UTF-8。即使文件中沒有任何UTF-8字符(它們可能是從另一個文件傳入的),該文件必須使用UTF-8才能與UTF-8一起使用。

+0

我檢查過它是UTF-8,至少當我將它保存在Notepad ++中時。整個網站在俄羅斯工作得很好 - 網址,固定鏈接,我可以搜索,甚至YARP插件似乎工作。它只是正則表達式中的一種語法,缺少或者不正確。 : -/ – ilia 2011-01-20 13:12:55

+0

你能發表一個傳遞表達式的字符串嗎?以ASCII爲例。只是爲了規範編碼。 – 2011-01-20 13:38:45

0

的 「u」 PCRE正則表達式的選項提供的Unicode,所以:

<?php 
    $str = 'тест бла бла бла'; 
    if(preg_match("'тест'isu", $str, $match)) 
    { 
    echo $match; 
    } 
?> 

此外,例如用於preg_replace函數:

<?php 
    $str = 'тест бла бла бла'; 
    echo preg_replace("'бла'isu", '', $str); 
?> 
相關問題