Por favor, eche un vistazo a esto:
como puede ver, solo hay una coincidencia en regex101 , pero el navegador coincide con dos palabras que son idénticas. Entonces, ¿por qué regex101 no puede coincidir con la segunda palabra? De todos modos, necesito hacer coincidir ambas palabras (o más si existe) .
Observó que no está relacionado con la bandera g . Porque lo he usado en el violín.
Aquí está el violín
Tratar con un texto así es difícil para su uso posterior. Tienes que encontrar una representación diferente de cada letra para cambiar la palabra de búsqueda de مجلس a otra como احمدی نژاد según la solución de @Wiktor.
Es por eso que el proceso de normalización es útil:
La normalización es un proceso que implica transformar caracteres y secuencias de caracteres en una representación subyacente definida formalmente. Este proceso es más importante cuando se necesita comparar el texto para clasificarlo y buscarlo, pero también se usa cuando se almacena texto para garantizar que el texto se almacene en una representación coherente.
Necesitamos normalizar nuestra cadena de entrada en primer lugar usando Normalizer::normalize() y luego, sin ningún cambio en Regular Expression, podemos ejecutar con seguridad un preg_match_all sobre ella:
<?php $text = <<< 'STR' یک نماینده مجلس عنوان کرد: ﺩﺭ ﺩﻭﺭﻩ ﺍﺣﻤﺪﯼﻧﮋﺍﺩ ﻣﺮﺩﻡ ﺩﺭ ﺭﻓﺎﻩ ﺑﻮﺩﻧﺪ !/دولت سابق تنها دولتی که پس از انقلاب به مردم خدمت کرد! ﻳﻚ ﻧﻤﺎﯾﻨﺪﻩ ﮔﺮﻭﻩ ﭘﺎﻳﺪﺍﺭی دﺭ ﻣﺠﻠﺲ ﺷﻮﺭﺍﯼ ﺍﺳﻼﻣﯽ ﺩﺭ ﭘﺎﺳﺦ ﺑﻪ ﺳﺆﺍﻟﯽ ﺩﺭ ﻣﻮﺭﺩ ﺑﺎﺯﮔﺸﺖ ﺍﺣﻤﺪﯼﻧﮋﺍﺩ ﺑﻪ ﻋﺮﺻﻪ ﺍﻧﺘﺨﺎﺑﺎﺕ ﺍﻇﻬﺎﺭ ﺩﺍﺷﺖ : ﻣﺎ ﺍﻣﯿﺪﻭﺍﺭﯾﻢ ﺍﯾﻦ ﺍﺗﻔﺎﻕ ﺑﯿﻔﺘﺪ ﻭ ﺍﺣﻤﺪﯼﻧﮋﺍﺩ ﺑﺮﺍﯼ ﺷﺮﮐﺖ ﺩﺭ ﺍﻧﺘﺨﺎﺑﺎﺕ ﺣﺎﺿﺮ ﺷﻮﺩ چرا که دولت وی تنها دولتی است که پس از انقلاب به مردم خدمت کرده است. STR; $normalizedText = normalizer_normalize( $text , Normalizer::NFKC ); preg_match_all('~مجلس~', $normalizedText, $matches); print_r($matches);Salidas:
Array ( [0] => Array ( [0] => مجلس [1] => مجلس ) ) Nota: necesita la extensión php_intl.dll para estar habilitada.
Las palabras están escritas con caracteres diferentes que se ven iguales pero tienen diferentes códigos Unicode.
\uFEE3\uFEA0\uFEE0\uFEB2... FORM en el nombre): \u0645\u062C\u0644\u0633Aquí están los códigos:
FEE3 ARABIC LETTER MEEM INITIAL FORM 0645 ARABIC LETTER MEEM FEA0 ARABIC LETTER JEEM MEDIAL FORM 062C ARABIC LETTER JEEM FEE0 ARABIC LETTER LAM MEDIAL FORM 0644 ARABIC LETTER LAM FEB2 ARABIC LETTER SEEN FINAL FORM 0633 ARABIC LETTER SEENNo puede hacer coincidir ambos con una representación literal de cualquiera de las palabras, debe usar una alternancia con las dos/todas las variantes, o usar clases de caracteres para esos caracteres:
[\x{FEE3}\x{0645}][\x{FEA0}\x{062C}][\x{FEE0}\x{0644}][\x{FEB2}\x{0633}]Vea la demostración de expresiones regulares .
Una demostración de PHP :
$re = '/[\x{FEE3}\x{0645}][\x{FEA0}\x{062C}][\x{FEE0}\x{0644}][\x{FEB2}\x{0633}]/u'; $str = 'یک نماینده مجلس عنوان کرد: ﺩﺭ ﺩﻭﺭﻩ ﺍﺣﻤﺪﯼﻧﮋﺍﺩ ﻣﺮﺩﻡ ﺩﺭ ﺭﻓﺎﻩ ﺑﻮﺩﻧﺪ !/دولت سابق تنها دولتی که پس از انقلاب به مردم خدمت کرد! ﻳﻚ ﻧﻤﺎﯾﻨﺪﻩ ﮔﺮﻭﻩ ﭘﺎﻳﺪﺍﺭی دﺭ ﻣﺠﻠﺲ ﺷﻮﺭﺍﯼ ﺍﺳﻼﻣﯽ ﺩﺭ ﭘﺎﺳﺦ ﺑﻪ ﺳﺆﺍﻟﯽ ﺩﺭ ﻣﻮﺭﺩ ﺑﺎﺯﮔﺸﺖ ﺍﺣﻤﺪﯼﻧﮋﺍﺩ ﺑﻪ ﻋﺮﺻﻪ ﺍﻧﺘﺨﺎﺑﺎﺕ ﺍﻇﻬﺎﺭ ﺩﺍﺷﺖ : ﻣﺎ ﺍﻣﯿﺪﻭﺍﺭﯾﻢ ﺍﯾﻦ ﺍﺗﻔﺎﻕ ﺑﯿﻔﺘﺪ ﻭ ﺍﺣﻤﺪﯼﻧﮋﺍﺩ ﺑﺮﺍﯼ ﺷﺮﮐﺖ ﺩﺭ ﺍﻧﺘﺨﺎﺑﺎﺕ ﺣﺎﺿﺮ ﺷﻮﺩ چرا که دولت وی تنها دولتی است که پس از انقلاب به مردم خدمت کرده است.'; preg_match_all($re, $str, $matches); print_r($matches[0]);Producción:
Array ( [0] => مجلس [1] => ﻣﺠﻠﺲ )