@ArtemJkee

Как подсветить буквы в слове, где есть латиница и кириллица (php)?

Приходит на вход строка, из нее нужно выбрать слова, где есть кириллица и латиница в одном слове, так же в слове могут быть все символы, я хочу подсветить другим цветом в этих словах буквы которые принадлежат латинице или кириллице, когда символ один, все срабатывает хорошо, когда 2 и более то второй символ не подсвечивает, помогите пожалуйста, как это реализовать?
echo "<table border='1' style='border-collapse:collapse;'>";
    echo '<tr>';
    
    echo "<td style='padding:10px;'>Модель</td>";
    $count = 0;
    echo "<td style='padding:10px;'>Код</td>";
    echo '</tr>';
    foreach ($arrAllItems as $arrAllItem){
        $i++;
        if ($i > 300) {
            break; 
        }
        // $words = preg_split('/(^[а-яА-ЯёЁ]+[\-\/.,+*()0-9]*[a-zA-Z]+|[a-zA-Z]+[\-\/.,+*()0-9]*[а-яА-ЯёЁ]+)/ui', $arrAllItem['Model'],-1,PREG_SPLIT_NO_EMPTY);
        $wordsVar = preg_match_all('/[а-яА-ЯёЁ]+[\-\/.,+*()0-9]*[a-zA-Z]+|[a-zA-Z]+[\-\/.,+*()0-9]*[а-яА-ЯёЁ]+/ui', $arrAllItem['Model'], $words);
        $new_array = array_values(array_diff($words, array('')));
        foreach ($words[0] as $key => $word) {
           // if (!preg_match_all("/^(?:\p{Cyrillic}+|\p{Latin}+)$/ui", $word, $out)) {
            $arrNonCorrect = array();
            if (preg_match_all("/(?:[а-яА-ЯёЁ]+\W)/ui", $word, $out)) {
                if (!empty($arrAllItem['Model'])) {
                    $str = $arrAllItem['Model'];
                    $res = preg_match_all('/(?:[a-zA-Z]+)/ui', $word, $matches);
                    array_push($arrNonCorrect, array('alltext'=>$arrAllItem['Model'], 'model'=>array('eng'=>$matches[0], 'rus'=>$out[0]), 'CODE'=>$arrAllItem['CODE']));

                    
                    foreach ($arrNonCorrect as $item){
                        echo '<tr>';
                        echo "<td style='padding:10px;'>";
                        // $str = $arrAllItem['Model'];
                        foreach ($item['model']['eng'] as $value) {
                            // echo "<span style='color: red; font-weight:bold;'>".$value."<br></span>";
                            $str = preg_replace('/(?:'.$value.')/ius','<b style="color: blue;">'.$value.'</b>', $str, 1);
                        } 

                        echo $str;
                        echo '</td>';
                       
                        echo "<td style='padding:10px;'>{$item['CODE']}</td>";
                        
                        echo '</tr>';
                    }
                }
                
            }
        }
        
        
    }

    echo '</table>';

61cd8338ec8b9815433309.png
  • Вопрос задан
  • 264 просмотра
Пригласить эксперта
Ответы на вопрос 2
@dodo512
$str = $arrAllItem['Model'];

$str = preg_replace(
    '#[A-Z][-/.,+*()\d]*\K[А-ЯЁ]+|[А-ЯЁ][-/.,+*()\d]*\K[A-Z]+#iu',
    '<b style="color: blue;">$0</b>',
    $str
);

echo $str;

sandbox.onlinephpfunctions.com/code/fcdd8f332e6fc4...

Или
$str = $arrAllItem['Model'];

$str = preg_replace(
    '#(?>\K[A-Z]+()|\K[А-ЯЁ]+()|[-/.,+*()\d]+)+?\1\2#iu',
    '<b style="color: blue;">$0</b>',
    $str
);

echo $str;

sandbox.onlinephpfunctions.com/code/677eab672e4378...
Ответ написан
@spaceatmoon
Regex не поддерживает работу с оператором И, только ИЛИ. Да и вообще лучше отказаться от таких монстров и сделать две простые регулярки и сделать что-то типа такого
if (hasCyrilic($str) and hasSimleSymbols()) {
... какой-то код.
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы