2011-01-19 16 views
7

¿Cómo puedo hacer coincidir una palabra rusa en una cadena (también en ruso) en PHP?¿Cómo puedo asociar una palabra rusa usando preg_replace en PHP?

Así, por ejemplo, algo como esto:

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

me trató utf8_encode y htmlentities con UTF-8 para el patrón de bandera $, pero no funcionó. ¿Debería también codificar $ string_in_russian?

Actualización: Sugerencia para/u bandera no funcionaba, así que estoy poniendo el código real que necesito esto para. Es a partir de un complemento de glosario para Wordpress (mi sitio está configurado correctamente para usar el idioma ruso, y funciona, pero no en este caso). Así que aquí está el código

$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); 

Cuando hago un eco rápido al comentario HTML este es el tipo de cuerda que me pasa por el patrón
/\bсловоs*?\b(?=([^"]*"[^"]")[^"]*$)/iu

Y así, que todavía no parece funcionar. Pensé que tal vez era la "s" la que me estaba jodiendo (este nivel de expresiones regulares está un poco más allá de mí, pero supongo que está ahí para posibles plurales), pero eliminarlo no ayudó.

Actualización # 2: Bueno por lo que decidió hacer un completo "pizarra en blanco" prueba - simple archivo PHP con algunas cadenas de contenido $ en palabras rusas y de destino Inglés y de reemplazar. Aquí está el código

$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); 

Y aquí está una captura de pantalla de la salida http://www.flickr.com/photos/iliadraznin/5372578707/

Como se puede ver el texto Inglés había sustituido la palabra objetivo, mientras que el ruso no tiene y el código es idéntico y yo estoy usando la bandera/u. El archivo también está codificado en UTF-8. ¿Alguna sugerencia? (y de nuevo, intenté eliminar la "s", todavía nada)

+2

en la Rusia soviética, ruso palabra expresiones regulares partido USTED! – goat

Respuesta

7

Si haces una prueba de pizarra en blanco, verás que no hay nada de malo en el ruso: en realidad, es el aspecto de límite de palabra que está rompiendo la expresión regular.

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

palabra abreviada límite no es UTF-8 en cuenta, por lo que, por esta pregunta: php regex word boundary matching in utf-8 puede probar lo siguiente:

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

que funciona muy bien en mi prueba aquí.

+0

Ahhh ya veo. Nunca lo haría Creí que tenía algo que ver con el límite de palabras. Gracias. Parece que el resto de la expresión - (? = ([^ "] *" [^ "] *") * [^ "] * $) - Lo rompe, pero puedo usar diferentes expresiones basadas en el lenguaje así que eso no debería ser un problema. – ilia

+0

Un límite de palabras mediante '\ b' es en realidad lo mismo que' (?: (? <= \ W) (?! \ W) | (? tchrist

+1

Para que '\ w' funcione correctamente en Java requiere' [\ pL \ pM \ p {Nd} \ p {Nl} \ p {Pc} [\ p {InEnclosedAlphanumerics} && \ p {So}]] ', pero no puedes hacer charclass conjuntivo en php. Pero probablemente puedas vivir sin el bit final, así que simplemente '[\ pL \ pM \ p {Nd} \ p {Nl} \ p {Pc}]'. Eso significa que '\ b' tendría que ser' (?: (? <= [\ PL \ pM \ p {Nd} \ p {Nl} \ p {Pc}]) (?! [\ PL \ pM \ p {Nd} \ p {Nl} \ p {Pc}]) | (? tchrist

1

Para empezar, debe asegurarse de que su archivo php está codificado con UTF-8. Incluso si no tiene ningún carácter UTF-8 en el archivo (es posible que se transfieran desde otro archivo), el archivo debe ser UTF-8 para que las funciones dentro de él funcionen con UTF-8.

+0

Lo comprobé, es UTF-8, al menos cuando lo guardo en Notepad ++.Y todo el sitio funciona bien en ruso: URL, enlaces permanentes, puedo buscar, diablos, incluso el complemento YARP parece funcionar. Debe ser solo una sintaxis en la expresión regular, falta algo o es incorrecto. : -/ – ilia

+0

¿Podría publicar una cadena que pase la expresión? En ASCII, por ejemplo. Solo para descartar la codificación. –

+0

¿Por "pasa la expresión" quieres decir trabajos? Cualquier palabra en inglés funciona, al menos las pocas que probé: si está en $ contenido, lo encuentra y lo reemplaza con $ glossary_replace. Solo tengo problemas con las palabras rusas. Entonces "/ \ bwords *? \ B (? = ([^"] * "[^"] ") [^"] * $)/I "funciona – ilia

0

"u" opción en la expresión regular PCRE de Unicode proporciona, por lo que:

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

También, ejemplo para preg_replace:

<?php 
    $str = 'тест бла бла бла'; 
    echo preg_replace("'бла'isu", '', $str); 
?> 
Cuestiones relacionadas